@wolpertingerlabs/drawlatch 1.0.0-alpha.3 → 1.0.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/bin/drawlatch.js +2 -2
  2. package/dist/connections/{anthropic.json → ai/anthropic.json} +19 -1
  3. package/dist/connections/{devin.json → ai/devin.json} +7 -1
  4. package/dist/connections/{google-ai.json → ai/google-ai.json} +7 -1
  5. package/dist/connections/{openai.json → ai/openai.json} +7 -1
  6. package/dist/connections/{openrouter.json → ai/openrouter.json} +7 -1
  7. package/dist/connections/developer-tools/github.json +84 -0
  8. package/dist/connections/{hex.json → developer-tools/hex.json} +7 -1
  9. package/dist/connections/developer-tools/linear.json +75 -0
  10. package/dist/connections/{lichess.json → gaming/lichess.json} +7 -1
  11. package/dist/connections/messaging/discord-bot.json +114 -0
  12. package/dist/connections/{discord-oauth.json → messaging/discord-oauth.json} +7 -1
  13. package/dist/connections/messaging/slack.json +75 -0
  14. package/dist/connections/messaging/telegram.json +66 -0
  15. package/dist/connections/{google.json → productivity/google.json} +7 -1
  16. package/dist/connections/productivity/notion.json +75 -0
  17. package/dist/connections/productivity/stripe.json +74 -0
  18. package/dist/connections/productivity/trello.json +113 -0
  19. package/dist/connections/{bluesky.json → social-media/bluesky.json} +41 -0
  20. package/dist/connections/social-media/mastodon.json +65 -0
  21. package/dist/connections/social-media/reddit.json +80 -0
  22. package/dist/connections/{twitch.json → social-media/twitch.json} +40 -0
  23. package/dist/connections/social-media/x.json +67 -0
  24. package/dist/mcp/server.js +279 -1
  25. package/dist/remote/ingestors/base-ingestor.d.ts +14 -3
  26. package/dist/remote/ingestors/base-ingestor.js +10 -2
  27. package/dist/remote/ingestors/discord/discord-gateway.d.ts +2 -2
  28. package/dist/remote/ingestors/discord/discord-gateway.js +5 -5
  29. package/dist/remote/ingestors/manager.d.ts +75 -9
  30. package/dist/remote/ingestors/manager.js +309 -40
  31. package/dist/remote/ingestors/poll/poll-ingestor.d.ts +2 -2
  32. package/dist/remote/ingestors/poll/poll-ingestor.js +5 -5
  33. package/dist/remote/ingestors/registry.d.ts +2 -2
  34. package/dist/remote/ingestors/registry.js +2 -2
  35. package/dist/remote/ingestors/slack/socket-mode.d.ts +2 -2
  36. package/dist/remote/ingestors/slack/socket-mode.js +5 -5
  37. package/dist/remote/ingestors/types.d.ts +17 -0
  38. package/dist/remote/ingestors/webhook/base-webhook-ingestor.d.ts +46 -7
  39. package/dist/remote/ingestors/webhook/base-webhook-ingestor.js +115 -10
  40. package/dist/remote/ingestors/webhook/github-webhook-ingestor.d.ts +14 -0
  41. package/dist/remote/ingestors/webhook/github-webhook-ingestor.js +27 -2
  42. package/dist/remote/ingestors/webhook/lifecycle-types.d.ts +63 -0
  43. package/dist/remote/ingestors/webhook/lifecycle-types.js +12 -0
  44. package/dist/remote/ingestors/webhook/stripe-webhook-ingestor.js +2 -2
  45. package/dist/remote/ingestors/webhook/trello-webhook-ingestor.d.ts +17 -5
  46. package/dist/remote/ingestors/webhook/trello-webhook-ingestor.js +32 -26
  47. package/dist/remote/ingestors/webhook/webhook-lifecycle-manager.d.ts +46 -0
  48. package/dist/remote/ingestors/webhook/webhook-lifecycle-manager.js +261 -0
  49. package/dist/remote/server.js +556 -3
  50. package/dist/shared/config.d.ts +60 -0
  51. package/dist/shared/config.js +10 -3
  52. package/dist/shared/connections.d.ts +21 -5
  53. package/dist/shared/connections.js +56 -14
  54. package/dist/shared/listener-config.d.ts +157 -0
  55. package/dist/shared/listener-config.js +10 -0
  56. package/package.json +3 -3
  57. package/dist/connections/discord-bot.json +0 -24
  58. package/dist/connections/github.json +0 -25
  59. package/dist/connections/linear.json +0 -29
  60. package/dist/connections/mastodon.json +0 -25
  61. package/dist/connections/notion.json +0 -33
  62. package/dist/connections/reddit.json +0 -28
  63. package/dist/connections/slack.json +0 -23
  64. package/dist/connections/stripe.json +0 -25
  65. package/dist/connections/telegram.json +0 -26
  66. package/dist/connections/trello.json +0 -25
  67. package/dist/connections/x.json +0 -27
package/bin/drawlatch.js CHANGED
@@ -61,7 +61,7 @@ try {
61
61
  port: { type: "string" },
62
62
  host: { type: "string" },
63
63
  lines: { type: "string", short: "n", default: "50" },
64
- follow: { type: "boolean", default: true },
64
+ follow: { type: "boolean", default: false },
65
65
  path: { type: "boolean", default: false },
66
66
  },
67
67
  strict: false,
@@ -664,7 +664,7 @@ Usage: drawlatch logs [options]
664
664
 
665
665
  Options:
666
666
  -n, --lines <number> Number of lines to show (default: 50)
667
- --no-follow Print lines and exit (default: follow/tail)
667
+ --follow Follow/tail the log output (default: print and exit)
668
668
  -h, --help Show this help message
669
669
 
670
670
  Log file: ~/.drawlatch/logs/drawlatch.log
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Anthropic API",
3
+ "stability": "beta",
4
+ "category": "ai",
3
5
  "description": "Anthropic Claude API — messages, models, and more. Auth is handled automatically via the ANTHROPIC_API_KEY environment variable. Uses x-api-key header (not Bearer token). The anthropic-version header is set to 2023-06-01.",
4
6
  "docsUrl": "https://docs.anthropic.com/en/api",
5
7
  "headers": {
@@ -12,5 +14,21 @@
12
14
  },
13
15
  "allowedEndpoints": [
14
16
  "https://api.anthropic.com/**"
15
- ]
17
+ ],
18
+ "testConnection": {
19
+ "method": "POST",
20
+ "url": "https://api.anthropic.com/v1/messages",
21
+ "body": {
22
+ "model": "claude-3-haiku-20240307",
23
+ "max_tokens": 1,
24
+ "messages": [
25
+ {
26
+ "role": "user",
27
+ "content": "hi"
28
+ }
29
+ ]
30
+ },
31
+ "description": "Sends a minimal message to verify API key",
32
+ "expectedStatus": [200]
33
+ }
16
34
  }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Devin API",
3
+ "stability": "dev",
4
+ "category": "ai",
3
5
  "description": "Devin AI API — sessions, knowledge, and machine management. Auth is handled automatically via the DEVIN_API_KEY environment variable.",
4
6
  "docsUrl": "https://docs.devin.ai/api-reference/overview",
5
7
  "headers": {
@@ -11,5 +13,9 @@
11
13
  },
12
14
  "allowedEndpoints": [
13
15
  "https://api.devin.ai/**"
14
- ]
16
+ ],
17
+ "testConnection": {
18
+ "url": "https://api.devin.ai/v1/sessions",
19
+ "description": "Lists Devin sessions to verify API key"
20
+ }
15
21
  }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Google AI (Gemini) API",
3
+ "stability": "stable",
4
+ "category": "ai",
3
5
  "description": "Google AI Gemini API — chat completions, embeddings, image generation, token counting, and more. Auth is handled automatically via the GOOGLE_AI_API_KEY environment variable. Uses x-goog-api-key header (not Bearer token). This is separate from the 'google' connection which covers Google Workspace APIs (Sheets, Drive, etc.).",
4
6
  "docsUrl": "https://ai.google.dev/api",
5
7
  "headers": {
@@ -11,5 +13,9 @@
11
13
  },
12
14
  "allowedEndpoints": [
13
15
  "https://generativelanguage.googleapis.com/**"
14
- ]
16
+ ],
17
+ "testConnection": {
18
+ "url": "https://generativelanguage.googleapis.com/v1beta/models",
19
+ "description": "Lists available Gemini models"
20
+ }
15
21
  }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "OpenAI API",
3
+ "stability": "beta",
4
+ "category": "ai",
3
5
  "description": "OpenAI API — chat completions, embeddings, images, audio, files, fine-tuning, and more. Auth is handled automatically via the OPENAI_API_KEY environment variable.",
4
6
  "docsUrl": "https://platform.openai.com/docs/api-reference",
5
7
  "openApiUrl": "https://raw.githubusercontent.com/openai/openai-openapi/master/openapi.yaml",
@@ -12,5 +14,9 @@
12
14
  },
13
15
  "allowedEndpoints": [
14
16
  "https://api.openai.com/**"
15
- ]
17
+ ],
18
+ "testConnection": {
19
+ "url": "https://api.openai.com/v1/models",
20
+ "description": "Lists available models"
21
+ }
16
22
  }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "OpenRouter API",
3
+ "stability": "stable",
4
+ "category": "ai",
3
5
  "description": "OpenRouter unified LLM API — chat completions, models, generation stats, and more. Auth is handled automatically via the OPENROUTER_API_KEY environment variable.",
4
6
  "docsUrl": "https://openrouter.ai/docs/api-reference",
5
7
  "openApiUrl": "https://openrouter.ai/openapi.json",
@@ -12,5 +14,9 @@
12
14
  },
13
15
  "allowedEndpoints": [
14
16
  "https://openrouter.ai/api/**"
15
- ]
17
+ ],
18
+ "testConnection": {
19
+ "url": "https://openrouter.ai/api/v1/models",
20
+ "description": "Lists available models"
21
+ }
16
22
  }
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "GitHub API",
3
+ "stability": "beta",
4
+ "category": "developer-tools",
5
+ "description": "GitHub REST API — repositories, issues, pull requests, users, organizations, and more. Auth is handled automatically via the GITHUB_TOKEN environment variable. Includes a webhook ingestor for real-time events (push, pull_request, issues, etc.) — set GITHUB_WEBHOOK_SECRET and use poll_events to retrieve them.",
6
+ "docsUrl": "https://docs.github.com/en/rest",
7
+ "openApiUrl": "https://raw.githubusercontent.com/github/rest-api-description/main/descriptions/api.github.com/api.github.com.json",
8
+ "headers": {
9
+ "Authorization": "Bearer ${GITHUB_TOKEN}",
10
+ "Accept": "application/vnd.github+json",
11
+ "X-GitHub-Api-Version": "2022-11-28",
12
+ "User-Agent": "drawlatch"
13
+ },
14
+ "secrets": {
15
+ "GITHUB_TOKEN": "${GITHUB_TOKEN}",
16
+ "GITHUB_WEBHOOK_SECRET": "${GITHUB_WEBHOOK_SECRET}"
17
+ },
18
+ "allowedEndpoints": ["https://api.github.com/**"],
19
+ "ingestor": {
20
+ "type": "webhook",
21
+ "webhook": {
22
+ "path": "github",
23
+ "signatureHeader": "X-Hub-Signature-256",
24
+ "signatureSecret": "GITHUB_WEBHOOK_SECRET"
25
+ }
26
+ },
27
+ "testIngestor": {
28
+ "description": "Verifies that the GitHub webhook secret is configured",
29
+ "strategy": "webhook_verify",
30
+ "requireSecrets": ["GITHUB_WEBHOOK_SECRET"]
31
+ },
32
+ "listenerConfig": {
33
+ "name": "GitHub Webhook Listener",
34
+ "description": "Receives real-time events from GitHub via webhooks. Supports multiple concurrent instances to filter events from different repositories.",
35
+ "supportsMultiInstance": true,
36
+ "fields": [
37
+ {
38
+ "key": "repoFilter",
39
+ "label": "Repository Filter",
40
+ "description": "Only capture webhook events from these repositories (owner/repo format). Leave empty for all.",
41
+ "type": "text[]",
42
+ "instanceKey": true,
43
+ "placeholder": "e.g., octocat/Hello-World",
44
+ "group": "Filtering"
45
+ },
46
+ {
47
+ "key": "eventFilter",
48
+ "label": "Event Types",
49
+ "description": "Which GitHub event types to capture. Leave empty for all.",
50
+ "type": "multiselect",
51
+ "default": [],
52
+ "options": [
53
+ {"value": "push", "label": "Push"},
54
+ {"value": "pull_request", "label": "Pull Request"},
55
+ {"value": "issues", "label": "Issues"},
56
+ {"value": "issue_comment", "label": "Issue Comment"},
57
+ {"value": "create", "label": "Branch/Tag Created"},
58
+ {"value": "delete", "label": "Branch/Tag Deleted"},
59
+ {"value": "release", "label": "Release"},
60
+ {"value": "workflow_run", "label": "Workflow Run"},
61
+ {"value": "check_run", "label": "Check Run"},
62
+ {"value": "star", "label": "Star"},
63
+ {"value": "fork", "label": "Fork"},
64
+ {"value": "deployment", "label": "Deployment"}
65
+ ],
66
+ "group": "Filtering"
67
+ },
68
+ {
69
+ "key": "bufferSize",
70
+ "label": "Buffer Size",
71
+ "description": "Maximum number of events to keep in memory.",
72
+ "type": "number",
73
+ "default": 200,
74
+ "min": 10,
75
+ "max": 1000,
76
+ "group": "Advanced"
77
+ }
78
+ ]
79
+ },
80
+ "testConnection": {
81
+ "url": "https://api.github.com/user",
82
+ "description": "Fetches the authenticated user profile"
83
+ }
84
+ }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Hex API",
3
+ "stability": "dev",
4
+ "category": "developer-tools",
3
5
  "description": "Hex API — projects, runs, users, groups, collections, and data connections. Auth is handled automatically via the HEX_TOKEN environment variable.",
4
6
  "docsUrl": "https://learn.hex.tech/docs/api/api-overview",
5
7
  "headers": {
@@ -10,5 +12,9 @@
10
12
  },
11
13
  "allowedEndpoints": [
12
14
  "https://app.hex.tech/api/**"
13
- ]
15
+ ],
16
+ "testConnection": {
17
+ "url": "https://app.hex.tech/api/v1/user/me",
18
+ "description": "Fetches the authenticated Hex user"
19
+ }
14
20
  }
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "Linear API",
3
+ "stability": "beta",
4
+ "category": "developer-tools",
5
+ "description": "Linear GraphQL API — issues, projects, teams, cycles, and more. Auth is handled automatically via the LINEAR_API_KEY environment variable. All requests are GraphQL queries sent as POST to https://api.linear.app/graphql. Includes a poll ingestor that periodically fetches recently updated issues — use poll_events to retrieve them.",
6
+ "docsUrl": "https://developers.linear.app/docs/graphql/working-with-the-graphql-api",
7
+ "headers": {
8
+ "Authorization": "${LINEAR_API_KEY}",
9
+ "Content-Type": "application/json"
10
+ },
11
+ "secrets": {
12
+ "LINEAR_API_KEY": "${LINEAR_API_KEY}"
13
+ },
14
+ "allowedEndpoints": [
15
+ "https://api.linear.app/**"
16
+ ],
17
+ "ingestor": {
18
+ "type": "poll",
19
+ "poll": {
20
+ "url": "https://api.linear.app/graphql",
21
+ "intervalMs": 60000,
22
+ "method": "POST",
23
+ "body": {
24
+ "query": "{ issues(orderBy: updatedAt, first: 50) { nodes { id identifier title state { name } priority updatedAt createdAt assignee { name } } } }"
25
+ },
26
+ "responsePath": "data.issues.nodes",
27
+ "deduplicateBy": "id",
28
+ "eventType": "issue_updated"
29
+ }
30
+ },
31
+ "testIngestor": {
32
+ "description": "Executes a minimal GraphQL query to verify Linear API access",
33
+ "strategy": "poll_once",
34
+ "request": {
35
+ "method": "POST",
36
+ "url": "https://api.linear.app/graphql",
37
+ "body": {"query": "{ viewer { id } }"},
38
+ "expectedStatus": [200]
39
+ }
40
+ },
41
+ "listenerConfig": {
42
+ "name": "Linear Poll Listener",
43
+ "description": "Polls Linear for recently updated issues at a configurable interval.",
44
+ "fields": [
45
+ {
46
+ "key": "intervalMs",
47
+ "label": "Poll Interval (ms)",
48
+ "description": "How often to check for new events, in milliseconds.",
49
+ "type": "number",
50
+ "default": 60000,
51
+ "min": 10000,
52
+ "max": 3600000,
53
+ "group": "Connection"
54
+ },
55
+ {
56
+ "key": "bufferSize",
57
+ "label": "Buffer Size",
58
+ "description": "Maximum number of events to keep in memory.",
59
+ "type": "number",
60
+ "default": 200,
61
+ "min": 10,
62
+ "max": 1000,
63
+ "group": "Advanced"
64
+ }
65
+ ]
66
+ },
67
+ "testConnection": {
68
+ "method": "POST",
69
+ "url": "https://api.linear.app/graphql",
70
+ "body": {
71
+ "query": "{ viewer { id name } }"
72
+ },
73
+ "description": "Fetches the authenticated user via GraphQL"
74
+ }
75
+ }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Lichess API",
3
+ "stability": "stable",
4
+ "category": "gaming",
3
5
  "description": "Lichess Opening Explorer, Cloud Evaluation, and authenticated API — query master and rated game statistics by opening move sequence, get cached Stockfish engine evaluations by FEN position, and access authenticated endpoints (account info, game history, player-specific opening analysis, etc.). Set LICHESS_API_TOKEN to a personal access token for authenticated routes; public endpoints (Opening Explorer, Cloud Eval) work without it.",
4
6
  "docsUrl": "https://lichess.org/api",
5
7
  "headers": {
@@ -11,5 +13,9 @@
11
13
  "allowedEndpoints": [
12
14
  "https://explorer.lichess.ovh/**",
13
15
  "https://lichess.org/api/**"
14
- ]
16
+ ],
17
+ "testConnection": {
18
+ "url": "https://lichess.org/api/account",
19
+ "description": "Fetches the authenticated Lichess account"
20
+ }
15
21
  }
@@ -0,0 +1,114 @@
1
+ {
2
+ "name": "Discord Bot API",
3
+ "stability": "stable",
4
+ "category": "messaging",
5
+ "description": "Discord Bot API (v10) — guilds, channels, messages, users, roles, and more. Auth is handled automatically via the DISCORD_BOT_TOKEN environment variable. Uses the 'Bot' authorization prefix. For OAuth2 user-scoped access, use the 'discord-oauth' connection instead. Includes a Gateway ingestor for real-time events (messages, reactions, etc.) — use poll_events to retrieve them.",
6
+ "docsUrl": "https://discord.com/developers/docs/intro",
7
+ "openApiUrl": "https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json",
8
+ "headers": {
9
+ "Authorization": "Bot ${DISCORD_BOT_TOKEN}",
10
+ "Content-Type": "application/json"
11
+ },
12
+ "secrets": {
13
+ "DISCORD_BOT_TOKEN": "${DISCORD_BOT_TOKEN}"
14
+ },
15
+ "allowedEndpoints": [
16
+ "https://discord.com/api/v10/**"
17
+ ],
18
+ "ingestor": {
19
+ "type": "websocket",
20
+ "websocket": {
21
+ "gatewayUrl": "wss://gateway.discord.gg/?v=10&encoding=json",
22
+ "protocol": "discord",
23
+ "intents": 3276799
24
+ }
25
+ },
26
+ "testIngestor": {
27
+ "description": "Verifies the bot token has Gateway access",
28
+ "strategy": "websocket_auth",
29
+ "request": {
30
+ "url": "https://discord.com/api/v10/gateway/bot",
31
+ "description": "Checks bot token has gateway access"
32
+ }
33
+ },
34
+ "listenerConfig": {
35
+ "name": "Discord Gateway Listener",
36
+ "description": "Real-time events from Discord via the Gateway WebSocket.",
37
+ "fields": [
38
+ {
39
+ "key": "eventFilter",
40
+ "label": "Event Types",
41
+ "description": "Which Gateway event types to capture. Leave empty for all.",
42
+ "type": "multiselect",
43
+ "default": [],
44
+ "options": [
45
+ {"value": "MESSAGE_CREATE", "label": "Message Create"},
46
+ {"value": "MESSAGE_UPDATE", "label": "Message Update"},
47
+ {"value": "MESSAGE_DELETE", "label": "Message Delete"},
48
+ {"value": "MESSAGE_REACTION_ADD", "label": "Reaction Add"},
49
+ {"value": "MESSAGE_REACTION_REMOVE", "label": "Reaction Remove"},
50
+ {"value": "GUILD_MEMBER_ADD", "label": "Member Join"},
51
+ {"value": "GUILD_MEMBER_REMOVE", "label": "Member Leave"},
52
+ {"value": "CHANNEL_CREATE", "label": "Channel Create"},
53
+ {"value": "CHANNEL_UPDATE", "label": "Channel Update"},
54
+ {"value": "CHANNEL_DELETE", "label": "Channel Delete"},
55
+ {"value": "PRESENCE_UPDATE", "label": "Presence Update"},
56
+ {"value": "TYPING_START", "label": "Typing Start"},
57
+ {"value": "VOICE_STATE_UPDATE", "label": "Voice State Update"}
58
+ ],
59
+ "group": "Filtering"
60
+ },
61
+ {
62
+ "key": "guildIds",
63
+ "label": "Server (Guild) IDs",
64
+ "description": "Only receive events from these Discord servers. Leave empty for all.",
65
+ "type": "text[]",
66
+ "placeholder": "e.g., 123456789012345678",
67
+ "dynamicOptions": {
68
+ "url": "https://discord.com/api/v10/users/@me/guilds",
69
+ "labelField": "name",
70
+ "valueField": "id"
71
+ },
72
+ "group": "Filtering"
73
+ },
74
+ {
75
+ "key": "channelIds",
76
+ "label": "Channel IDs",
77
+ "description": "Only receive events from these channels. Leave empty for all.",
78
+ "type": "text[]",
79
+ "placeholder": "e.g., 123456789012345678",
80
+ "group": "Filtering"
81
+ },
82
+ {
83
+ "key": "userIds",
84
+ "label": "User IDs",
85
+ "description": "Only receive events from these users. Leave empty for all.",
86
+ "type": "text[]",
87
+ "placeholder": "e.g., 123456789012345678",
88
+ "group": "Filtering"
89
+ },
90
+ {
91
+ "key": "intents",
92
+ "label": "Gateway Intents",
93
+ "description": "Bitmask controlling which events the bot receives. See Discord docs for values.",
94
+ "type": "number",
95
+ "default": 3276799,
96
+ "group": "Advanced"
97
+ },
98
+ {
99
+ "key": "bufferSize",
100
+ "label": "Buffer Size",
101
+ "description": "Maximum number of events to keep in memory.",
102
+ "type": "number",
103
+ "default": 200,
104
+ "min": 10,
105
+ "max": 1000,
106
+ "group": "Advanced"
107
+ }
108
+ ]
109
+ },
110
+ "testConnection": {
111
+ "url": "https://discord.com/api/v10/users/@me",
112
+ "description": "Fetches the authenticated bot user"
113
+ }
114
+ }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Discord OAuth2 API",
3
+ "stability": "dev",
4
+ "category": "messaging",
3
5
  "description": "Discord OAuth2 API (v10) — user identity, guilds, connections, and other user-scoped data. Auth is handled automatically via the DISCORD_OAUTH_TOKEN environment variable (OAuth2 Bearer access token). Access is limited to the scopes the user authorized. For full bot access, use the 'discord-bot' connection instead.",
4
6
  "docsUrl": "https://discord.com/developers/docs/topics/oauth2",
5
7
  "openApiUrl": "https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json",
@@ -12,5 +14,9 @@
12
14
  },
13
15
  "allowedEndpoints": [
14
16
  "https://discord.com/api/v10/**"
15
- ]
17
+ ],
18
+ "testConnection": {
19
+ "url": "https://discord.com/api/v10/users/@me",
20
+ "description": "Fetches the authenticated OAuth2 user"
21
+ }
16
22
  }
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "Slack API",
3
+ "stability": "stable",
4
+ "category": "messaging",
5
+ "description": "Slack Web API — messages, channels, users, reactions, files, and more. Auth is handled automatically via the SLACK_BOT_TOKEN environment variable. Real-time events via Socket Mode require SLACK_APP_TOKEN.",
6
+ "docsUrl": "https://docs.slack.dev/apis/web-api",
7
+ "openApiUrl": "https://raw.githubusercontent.com/slackapi/slack-api-specs/master/web-api/slack_web_openapi_v2.json",
8
+ "headers": {
9
+ "Authorization": "Bearer ${SLACK_BOT_TOKEN}"
10
+ },
11
+ "secrets": {
12
+ "SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}",
13
+ "SLACK_APP_TOKEN": "${SLACK_APP_TOKEN}"
14
+ },
15
+ "allowedEndpoints": [
16
+ "https://slack.com/api/**"
17
+ ],
18
+ "ingestor": {
19
+ "type": "websocket",
20
+ "websocket": {
21
+ "gatewayUrl": "https://slack.com/api/apps.connections.open",
22
+ "protocol": "slack"
23
+ }
24
+ },
25
+ "testIngestor": {
26
+ "description": "Verifies the Slack app token for Socket Mode",
27
+ "strategy": "http_request",
28
+ "request": {
29
+ "method": "POST",
30
+ "url": "https://slack.com/api/apps.connections.open",
31
+ "headers": {"Authorization": "Bearer ${SLACK_APP_TOKEN}"},
32
+ "expectedStatus": [200]
33
+ }
34
+ },
35
+ "listenerConfig": {
36
+ "name": "Slack Socket Mode Listener",
37
+ "description": "Real-time events from Slack via Socket Mode WebSocket.",
38
+ "fields": [
39
+ {
40
+ "key": "eventFilter",
41
+ "label": "Event Types",
42
+ "description": "Which Slack event types to capture. Leave empty for all.",
43
+ "type": "multiselect",
44
+ "default": [],
45
+ "options": [
46
+ {"value": "message", "label": "Message"},
47
+ {"value": "reaction_added", "label": "Reaction Added"},
48
+ {"value": "reaction_removed", "label": "Reaction Removed"},
49
+ {"value": "channel_created", "label": "Channel Created"},
50
+ {"value": "channel_archive", "label": "Channel Archived"},
51
+ {"value": "member_joined_channel", "label": "Member Joined Channel"},
52
+ {"value": "member_left_channel", "label": "Member Left Channel"},
53
+ {"value": "app_mention", "label": "App Mention"},
54
+ {"value": "file_shared", "label": "File Shared"}
55
+ ],
56
+ "group": "Filtering"
57
+ },
58
+ {
59
+ "key": "bufferSize",
60
+ "label": "Buffer Size",
61
+ "description": "Maximum number of events to keep in memory.",
62
+ "type": "number",
63
+ "default": 200,
64
+ "min": 10,
65
+ "max": 1000,
66
+ "group": "Advanced"
67
+ }
68
+ ]
69
+ },
70
+ "testConnection": {
71
+ "method": "POST",
72
+ "url": "https://slack.com/api/auth.test",
73
+ "description": "Verifies the Slack bot token via auth.test"
74
+ }
75
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "Telegram Bot API",
3
+ "stability": "beta",
4
+ "category": "messaging",
5
+ "description": "Telegram Bot API — messages, chats, users, inline queries, payments, and more. Auth uses a bot token embedded in the URL path — include /bot${TELEGRAM_BOT_TOKEN}/ in your request URLs. The placeholder is resolved automatically from the route's secrets. Create a bot via @BotFather on Telegram to obtain a token. Includes a poll ingestor that fetches new updates via getUpdates — use poll_events to retrieve them.",
6
+ "docsUrl": "https://core.telegram.org/bots/api",
7
+ "headers": {
8
+ "Content-Type": "application/json"
9
+ },
10
+ "secrets": {
11
+ "TELEGRAM_BOT_TOKEN": "${TELEGRAM_BOT_TOKEN}"
12
+ },
13
+ "resolveSecretsInBody": true,
14
+ "allowedEndpoints": [
15
+ "https://api.telegram.org/**"
16
+ ],
17
+ "ingestor": {
18
+ "type": "poll",
19
+ "poll": {
20
+ "url": "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getUpdates?limit=25&timeout=0",
21
+ "intervalMs": 30000,
22
+ "method": "GET",
23
+ "responsePath": "result",
24
+ "deduplicateBy": "update_id",
25
+ "eventType": "update"
26
+ }
27
+ },
28
+ "testIngestor": {
29
+ "description": "Calls getMe to verify the Telegram bot token",
30
+ "strategy": "poll_once",
31
+ "request": {
32
+ "url": "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe",
33
+ "expectedStatus": [200]
34
+ }
35
+ },
36
+ "listenerConfig": {
37
+ "name": "Telegram Poll Listener",
38
+ "description": "Polls Telegram for new updates at a configurable interval.",
39
+ "fields": [
40
+ {
41
+ "key": "intervalMs",
42
+ "label": "Poll Interval (ms)",
43
+ "description": "How often to check for new updates, in milliseconds.",
44
+ "type": "number",
45
+ "default": 30000,
46
+ "min": 5000,
47
+ "max": 3600000,
48
+ "group": "Connection"
49
+ },
50
+ {
51
+ "key": "bufferSize",
52
+ "label": "Buffer Size",
53
+ "description": "Maximum number of events to keep in memory.",
54
+ "type": "number",
55
+ "default": 200,
56
+ "min": 10,
57
+ "max": 1000,
58
+ "group": "Advanced"
59
+ }
60
+ ]
61
+ },
62
+ "testConnection": {
63
+ "url": "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe",
64
+ "description": "Fetches the bot's own user info"
65
+ }
66
+ }
@@ -1,5 +1,7 @@
1
1
  {
2
2
  "name": "Google APIs",
3
+ "stability": "dev",
4
+ "category": "productivity",
3
5
  "description": "Google APIs — Sheets, Docs, Drive, Calendar, Gmail, and more. Auth is handled automatically via the GOOGLE_API_TOKEN environment variable (OAuth2 access token or service account token). Multiple Google API domains are allowlisted.",
4
6
  "docsUrl": "https://developers.google.com/apis-explorer",
5
7
  "headers": {
@@ -24,5 +26,9 @@
24
26
  "https://youtube.googleapis.com/**",
25
27
  "https://youtubeanalytics.googleapis.com/**",
26
28
  "https://cloudresourcemanager.googleapis.com/**"
27
- ]
29
+ ],
30
+ "testConnection": {
31
+ "url": "https://www.googleapis.com/oauth2/v1/userinfo",
32
+ "description": "Fetches the authenticated user info"
33
+ }
28
34
  }