Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion integrations/catalog/airtable.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
"key": "AIRTABLE_API_KEY",
"label": "Airtable personal access token",
"type": "password",
"required": true
"required": true,
"helperText": "Personal access token from your Airtable account.",
"helperLink": "https://airtable.com/create/tokens"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/apify.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
"key": "APIFY_TOKEN",
"label": "Apify token",
"type": "password",
"required": true
"required": true,
"helperText": "API token from your Apify account settings.",
"helperLink": "https://console.apify.com/account/integrations"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/brave-search.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
"key": "BRAVE_API_KEY",
"label": "Brave API key",
"type": "password",
"required": true
"required": true,
"helperText": "API key from the Brave Search API portal.",
"helperLink": "https://api-dashboard.search.brave.com/app/keys"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/clickhouse.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@
"key": "CLICKHOUSE_PASSWORD",
"label": "Password",
"type": "password",
"required": true
"required": true,
"helperText": "Password for your ClickHouse user.",
"helperLink": "https://clickhouse.com/docs/operations/access-rights"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/elevenlabs.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
"key": "ELEVENLABS_API_KEY",
"label": "ElevenLabs API key",
"type": "password",
"required": true
"required": true,
"helperText": "API key from your ElevenLabs account settings.",
"helperLink": "https://elevenlabs.io/app/settings/api-keys"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/exa.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
"key": "EXA_API_KEY",
"label": "Exa API key",
"type": "password",
"required": true
"required": true,
"helperText": "API key from your Exa account.",
"helperLink": "https://exa.ai/docs/reference/getting-started"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/figma.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
"key": "FIGMA_API_KEY",
"label": "Figma personal access token",
"type": "password",
"required": true
"required": true,
"helperText": "Personal access token from your Figma account settings.",
"helperLink": "https://developers.figma.com/docs/rest-api/authentication/#personal-access-tokens"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/firecrawl.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
"key": "FIRECRAWL_API_KEY",
"label": "Firecrawl API key",
"type": "password",
"required": true
"required": true,
"helperText": "API key from your Firecrawl dashboard.",
"helperLink": "https://www.firecrawl.dev/app/api-keys"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/github.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,9 @@
"label": "Personal access token",
"type": "password",
"placeholder": "github_pat_...",
"required": true
"required": true,
"helperText": "Classic or fine-grained personal access token from GitHub settings.",
"helperLink": "https://github.com/settings/tokens"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/kagi.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
"key": "KAGI_API_KEY",
"label": "Kagi API key",
"type": "password",
"required": true
"required": true,
"helperText": "API key from your Kagi account settings.",
"helperLink": "https://kagi.com/settings?p=api"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/mongodb.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
"label": "MongoDB connection string",
"type": "password",
"placeholder": "mongodb+srv://user:pass@cluster.mongodb.net",
"required": true
"required": true,
"helperText": "Connection string from your MongoDB Atlas cluster.",
"helperLink": "https://www.mongodb.com/docs/atlas/connect-to-database-deployment/#connect-with-a-connection-string"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/neon.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,9 @@
"key": "NEON_API_KEY",
"label": "Neon API key",
"type": "password",
"required": true
"required": true,
"helperText": "API key from your Neon account settings.",
"helperLink": "https://neon.tech/docs/manage/api-keys"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/notion.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@
"label": "Internal integration token",
"type": "password",
"placeholder": "ntn_...",
"required": true
"required": true,
"helperText": "Internal integration token from your Notion integrations page.",
"helperLink": "https://www.notion.so/profile/integrations"
}
]
},
Expand Down
3 changes: 2 additions & 1 deletion integrations/catalog/obsidian.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
"label": "Local REST API key",
"type": "password",
"required": true,
"helperText": "From the Obsidian 'Local REST API' community plugin."
"helperText": "From the Obsidian 'Local REST API' community plugin.",
"helperLink": "https://github.com/coddingtonbear/obsidian-local-rest-api"
}
]
},
Expand Down
3 changes: 2 additions & 1 deletion integrations/catalog/redis.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@
"type": "password",
"placeholder": "redis://localhost:6379",
"required": true,
"helperText": "Appended as --url <redis_url>."
"helperText": "Connection URL for your Redis instance. Appended as --url <redis_url>.",
"helperLink": "https://redis.io/docs/latest/operate/rc/databases/connect/"
}
]
},
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/resend.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@
"key": "RESEND_API_KEY",
"label": "Resend API key",
"type": "password",
"required": true
"required": true,
"helperText": "API key from your Resend dashboard.",
"helperLink": "https://resend.com/api-keys"
},
{
"key": "SENDER_EMAIL_ADDRESS",
Expand Down
4 changes: 3 additions & 1 deletion integrations/catalog/slack.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@
"label": "Bot token",
"type": "password",
"placeholder": "xoxb-...",
"required": true
"required": true,
"helperText": "Bot token from your Slack app's OAuth & Permissions page.",
"helperLink": "https://api.slack.com/apps"
},
{
"key": "SLACK_TEAM_ID",
Expand Down
3 changes: 2 additions & 1 deletion integrations/catalog/supabase.json
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
"label": "Supabase access token",
"type": "password",
"required": true,
"helperText": "Personal access token from your Supabase dashboard."
"helperText": "Personal access token from your Supabase dashboard.",
"helperLink": "https://supabase.com/dashboard/account/tokens"
}
]
},
Expand Down
6 changes: 4 additions & 2 deletions integrations/catalog/tavily.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"research"
],
"popularityRank": 90,
"installHint": "Paste your Tavily API key the official tavily-mcp package runs via npx.",
"installHint": "Paste your Tavily API key - the official tavily-mcp package runs via npx.",
"kind": "mcp",
"defaultConnectionOptionId": "api",
"connectionOptions": [
Expand All @@ -32,7 +32,9 @@
"label": "Tavily API key",
"type": "password",
"placeholder": "tvly-...",
"required": true
"required": true,
"helperText": "API key from your Tavily dashboard.",
"helperLink": "https://app.tavily.com/home?tab=keys"
}
]
},
Expand Down
1 change: 1 addition & 0 deletions integrations/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export interface MarketplaceField {
type?: MarketplaceFieldType;
placeholder?: string;
helperText?: string;
helperLink?: string;
required?: boolean;
}

Expand Down
23 changes: 23 additions & 0 deletions tests/test_catalogs.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,29 @@ def test_catalog_entries_have_required_fields():
assert isinstance(entry["estimatedSetupMinutes"], int)


def test_credential_fields_have_helper_text_and_link():
"""All password fields must have helperText and helperLink so users know how to get credentials."""
for entry in load_catalog_entries("integrations/catalog"):
for option in entry["connectionOptions"]:
transport = option.get("transport", {})
for field_group in ("envFields", "argFields"):
for field in transport.get(field_group, []):
if field.get("type") == "password":
field_key = field.get("key", "<unknown>")
assert "helperText" in field, (
f"{entry['id']}: password field '{field_key}' is missing helperText"
)
assert "helperLink" in field, (
f"{entry['id']}: password field '{field_key}' is missing helperLink"
)
assert field["helperText"], (
f"{entry['id']}: password field '{field_key}' has empty helperText"
)
assert field["helperLink"].startswith("https://"), (
f"{entry['id']}: password field '{field_key}' helperLink must start with https://"
)


def test_node_package_exports_catalogs():
script = """
import { INTEGRATION_CATALOG, AUTOMATION_CATALOG } from './index.js';
Expand Down
Loading