Skip to content

Commit 74ad2b4

Browse files
authored
Feature/add more integrations (#949)
* chore: add redis mcp * chore: add jira integration * chore: add attio integration * chore: add supabase integration * chore: add ghost integration
1 parent 4828200 commit 74ad2b4

File tree

13 files changed

+275
-26
lines changed

13 files changed

+275
-26
lines changed

apps/web/src/lib/integrationTypeOptions.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,26 @@ export const HOSTED_INTEGRATION_TYPE_OPTIONS: Record<
128128
label: 'PostgreSQL',
129129
icon: 'postgres',
130130
},
131+
[HostedIntegrationType.Redis]: {
132+
label: 'Redis',
133+
icon: 'redis',
134+
},
135+
[HostedIntegrationType.Jira]: {
136+
label: 'Jira',
137+
icon: 'jira',
138+
},
139+
[HostedIntegrationType.Attio]: {
140+
label: 'Attio',
141+
icon: 'attio',
142+
},
143+
[HostedIntegrationType.Ghost]: {
144+
label: 'Ghost',
145+
icon: 'ghost',
146+
},
147+
[HostedIntegrationType.Supabase]: {
148+
label: 'Supabase',
149+
icon: 'supabase',
150+
},
131151
}
132152

133153
export function integrationOptions(

packages/constants/src/integrations.ts

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,30 +26,27 @@ export enum HostedIntegrationType {
2626
GoogleMaps = 'google_maps',
2727
Sentry = 'sentry',
2828
Puppeteer = 'puppeteer',
29-
30-
// Memory = 'memory', // short-lived file storage, useless
31-
// SequentialThinking = 'sequential_thinking', // useless
3229
Time = 'time',
33-
3430
browserbase = 'browserbase',
3531
Neon = 'neon',
32+
Postgres = 'postgres',
33+
Supabase = 'supabase',
34+
Redis = 'redis',
35+
Jira = 'jira',
36+
Attio = 'attio',
37+
Ghost = 'ghost',
3638

37-
// Gmail = 'google_drive', // env vars not supported, requires auth file
38-
// GoogleCalendar = 'google_drive', // env vars not supported, requires auth file
39-
// GoogleDrive = 'google_drive', // env vars not supported, requires auth file
40-
Postgres = 'postgres', // Uses a custom parameter in the command instead of env vars
41-
// Redis = 'redis', // Uses a custom parameter in the command instead of env vars
42-
// SQLite = 'sqlite', // Uses a custom parameter in the command instead of env vars
43-
39+
// Require all auth file :point_down:
40+
// Gmail = 'google_drive',
41+
// GoogleCalendar = 'google_drive',
42+
// GoogleDrive = 'google_drive',
4443
// GoogleWorkspace = 'google_workspace', // env vars not supported (?)
4544

45+
// TODO: implement these
4646
// Wordpress = 'wordpress', // Not on OpenTools
4747
// Discord = 'discord', // Not on OpenTools
4848
// Intercom = 'intercom', // Not on OpenTools
49-
// Jira = 'jira', // Not on OpenTools
50-
// Supabase = 'supabase', // Not on OpenTools
51-
// Hubspot = 'hubspot', // Not on OpenTools
52-
// Attio = 'attio', // Not on OpenTools
53-
// Loops = 'loops', // Not on OpenTools
54-
// Ghost = 'ghost', // Not on OpenTools
49+
50+
// Hubspot = 'hubspot', // Docker based
51+
// Loops = 'loops', // Does not exist
5552
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { HostedIntegrationConfig } from '../types'
2+
import { npxCommand } from '../utils'
3+
4+
export default {
5+
description: 'Integration for interacting with Attio CRM',
6+
command: npxCommand({
7+
package: 'attio-mcp-server',
8+
}),
9+
env: {
10+
ATTIO_API_KEY: {
11+
label: 'Attio API Key',
12+
description: 'The API key for the Attio API',
13+
placeholder: 'your-api-key',
14+
required: true,
15+
},
16+
},
17+
envSource: 'https://developers.attio.com/reference/get_v2-objects',
18+
} as HostedIntegrationConfig
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { HostedIntegrationConfig } from '../types'
2+
import { npxCommand } from '../utils'
3+
4+
export default {
5+
description: 'Integration for interacting with Ghost Admin API',
6+
command: npxCommand({
7+
package: '@mtane0412/ghost-mcp-server',
8+
}),
9+
env: {
10+
GHOST_URL: {
11+
label: 'Ghost URL',
12+
description: 'The URL of your Ghost instance',
13+
placeholder: 'https://example.com',
14+
required: true,
15+
},
16+
GHOST_ADMIN_API_KEY: {
17+
label: 'Ghost Admin API Key',
18+
description: 'The API key for the Ghost Admin API',
19+
placeholder: 'your-api-key',
20+
required: true,
21+
},
22+
},
23+
envSource: 'https://ghost.org/docs/admin-api/javascript/',
24+
} as HostedIntegrationConfig
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { uvxCommand } from '../utils'
2+
3+
export default {
4+
description: 'Interact with Jira issues and boards',
5+
command: uvxCommand({
6+
name: 'mcp-atlassian',
7+
}),
8+
env: {
9+
JIRA_URL: {
10+
label: 'Jira URL',
11+
description: 'The URL of your Jira instance',
12+
placeholder: 'https://your-jira-instance.com',
13+
required: true,
14+
},
15+
JIRA_USERNAME: {
16+
label: 'Jira Username',
17+
description: 'The username of your Jira account',
18+
placeholder: 'your-jira-username',
19+
required: true,
20+
},
21+
JIRA_API_TOKEN: {
22+
label: 'Jira API Token',
23+
description: 'The API token of your Jira account',
24+
placeholder: 'your-jira-api-token',
25+
required: true,
26+
},
27+
},
28+
envSource: 'https://id.atlassian.com/manage-profile/security/api-tokens',
29+
}

packages/core/src/services/integrations/hostedTypes/configs/postgres.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import { npxCommand } from '../utils'
33

44
export default {
55
description:
6-
'This integration enables read only access to a Postgres database.',
6+
'This integration enables read only access to a Postgres/Supabase database.',
77
command: npxCommand({
88
package: '@modelcontextprotocol/server-postgres',
9-
args: '$POSTGRES_URL',
9+
args: '$DATABASE_URL',
1010
}),
1111
env: {
12-
POSTGRES_URL: {
13-
label: 'Postgres URL',
14-
description: 'The URL of your Postgres database',
12+
DATABASE_URL: {
13+
label: 'Postgres/Supabase URL',
14+
description: 'The URL of your Postgres/Supabase database',
1515
placeholder: 'postgresql://user:password@host:port/database',
1616
required: true,
1717
},
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { npxCommand } from '../utils'
2+
3+
export default {
4+
description: 'Interact with Redis databases',
5+
command: npxCommand({
6+
package: '@gongrzhe/server-redis-mcp',
7+
args: '$REDIS_URL',
8+
}),
9+
env: {
10+
REDIS_URL: {
11+
label: 'Redis URL',
12+
description: 'The URL of your Redis instance',
13+
placeholder: 'redis://localhost:6379',
14+
required: true,
15+
},
16+
},
17+
envSource: 'https://id.atlassian.com/manage-profile/security/api-tokens',
18+
}

packages/core/src/services/integrations/hostedTypes/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ import TIME_MCP_CONFIG from './configs/time'
2424
import browserbase_MCP_CONFIG from './configs/browserbase'
2525
import NEON_MCP_CONFIG from './configs/neon'
2626
import POSTGRES_MCP_CONFIG from './configs/postgres'
27+
import REDIS_MCP_CONFIG from './configs/redis'
28+
import JIRA_MCP_CONFIG from './configs/jira'
29+
import ATTIO_MCP_CONFIG from './configs/attio'
30+
import GHOST_MCP_CONFIG from './configs/ghost'
2731

2832
export const HOSTED_MCP_CONFIGS: Record<
2933
HostedIntegrationType,
@@ -53,4 +57,9 @@ export const HOSTED_MCP_CONFIGS: Record<
5357
[HostedIntegrationType.browserbase]: browserbase_MCP_CONFIG,
5458
[HostedIntegrationType.Neon]: NEON_MCP_CONFIG,
5559
[HostedIntegrationType.Postgres]: POSTGRES_MCP_CONFIG,
60+
[HostedIntegrationType.Supabase]: POSTGRES_MCP_CONFIG,
61+
[HostedIntegrationType.Redis]: REDIS_MCP_CONFIG,
62+
[HostedIntegrationType.Jira]: JIRA_MCP_CONFIG,
63+
[HostedIntegrationType.Attio]: ATTIO_MCP_CONFIG,
64+
[HostedIntegrationType.Ghost]: GHOST_MCP_CONFIG,
5665
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { type LucideProps } from 'lucide-react'
2+
3+
export default function Attio(props: LucideProps) {
4+
return (
5+
<svg viewBox='0 0 60.9 50' {...props}>
6+
<g>
7+
<path
8+
d='M60.3,34.8l-5.1-8.1c0,0,0,0,0,0L54.7,26c-0.8-1.2-2.1-1.9-3.5-1.9L43,24L42.5,25l-9.8,15.7l-0.5,0.9l4.1,6.6
9+
c0.8,1.2,2.1,1.9,3.5,1.9h11.5c1.4,0,2.8-0.7,3.5-1.9l0.4-0.6c0,0,0,0,0,0l5.1-8.2C61.1,37.9,61.1,36.2,60.3,34.8L60.3,34.8z
10+
M58.7,38.3l-5.1,8.2c0,0,0,0.1-0.1,0.1c-0.2,0.2-0.4,0.2-0.5,0.2c-0.1,0-0.4,0-0.6-0.3l-5.1-8.2c-0.1-0.1-0.1-0.2-0.2-0.3
11+
c0-0.1-0.1-0.2-0.1-0.3c-0.1-0.4-0.1-0.8,0-1.3c0.1-0.2,0.1-0.4,0.3-0.6l5.1-8.1c0,0,0,0,0,0c0.1-0.2,0.3-0.3,0.4-0.3
12+
c0.1,0,0.1,0,0.1,0c0,0,0,0,0.1,0c0.1,0,0.4,0,0.6,0.3l5.1,8.1C59.2,36.6,59.2,37.5,58.7,38.3L58.7,38.3z'
13+
></path>
14+
<path
15+
d='M45.2,15.1c0.8-1.3,0.8-3.1,0-4.4l-5.1-8.1l-0.4-0.7C38.9,0.7,37.6,0,36.2,0H24.7c-1.4,0-2.7,0.7-3.5,1.9L0.6,34.9
16+
C0.2,35.5,0,36.3,0,37c0,0.8,0.2,1.5,0.6,2.2l5.5,8.8C6.9,49.3,8.2,50,9.7,50h11.5c1.4,0,2.8-0.7,3.5-1.9l0.4-0.7c0,0,0,0,0,0
17+
c0,0,0,0,0,0l4.1-6.6l12.1-19.4L45.2,15.1L45.2,15.1z M44,13c0,0.4-0.1,0.8-0.4,1.2L23.5,46.4c-0.2,0.3-0.5,0.3-0.6,0.3
18+
c-0.1,0-0.4,0-0.6-0.3l-5.1-8.2c-0.5-0.7-0.5-1.7,0-2.4L37.4,3.6c0.2-0.3,0.5-0.3,0.6-0.3c0.1,0,0.4,0,0.6,0.3l5.1,8.1
19+
C43.9,12.1,44,12.5,44,13z'
20+
></path>
21+
</g>
22+
</svg>
23+
)
24+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { type LucideProps } from 'lucide-react'
2+
import { LatitudeLogoMonochrome } from '..'
3+
4+
export default function Ghost(props: LucideProps) {
5+
// TODO: Cannot find svg logo for Ghost
6+
return <LatitudeLogoMonochrome {...props} />
7+
}

0 commit comments

Comments
 (0)