@getfoyer/mcp 0.1.0

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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env node
2
+ import { createInterface } from 'readline';
3
+ import { FoyerClient } from '@getfoyer/client';
4
+ const client = new FoyerClient({
5
+ baseUrl: process.env.FOYER_API_URL ?? 'http://localhost:3001',
6
+ token: process.env.FOYER_TOKEN ?? '',
7
+ });
8
+ const tools = [
9
+ {
10
+ name: 'foyer_create_feature_with_plan',
11
+ description: 'Create a Foyer planning feature from an externally generated plan.',
12
+ inputSchema: {
13
+ type: 'object',
14
+ required: ['title', 'description', 'plan', 'agentSource', 'agentRunId'],
15
+ properties: {
16
+ repoId: { type: 'string' },
17
+ workspaceId: { type: 'string' },
18
+ title: { type: 'string' },
19
+ description: { type: 'string' },
20
+ plan: { type: 'string' },
21
+ agentSource: { type: 'string' },
22
+ agentRunId: { type: 'string' },
23
+ metadata: { type: 'object' },
24
+ },
25
+ },
26
+ },
27
+ {
28
+ name: 'foyer_get_feature',
29
+ description: 'Fetch a Foyer feature, including plan and tasks.',
30
+ inputSchema: {
31
+ type: 'object',
32
+ required: ['featureId'],
33
+ properties: { featureId: { type: 'string' } },
34
+ },
35
+ },
36
+ {
37
+ name: 'foyer_update_plan',
38
+ description: 'Update a Foyer feature plan while it is still in planning.',
39
+ inputSchema: {
40
+ type: 'object',
41
+ required: ['featureId', 'plan'],
42
+ properties: { featureId: { type: 'string' }, plan: { type: 'string' } },
43
+ },
44
+ },
45
+ {
46
+ name: 'foyer_decompose_feature',
47
+ description: 'Approve a feature plan and enqueue decomposition.',
48
+ inputSchema: {
49
+ type: 'object',
50
+ required: ['featureId'],
51
+ properties: { featureId: { type: 'string' } },
52
+ },
53
+ },
54
+ {
55
+ name: 'foyer_list_comments',
56
+ description: 'List feature comments for review and revision.',
57
+ inputSchema: {
58
+ type: 'object',
59
+ required: ['featureId'],
60
+ properties: { featureId: { type: 'string' } },
61
+ },
62
+ },
63
+ {
64
+ name: 'foyer_handoff_task',
65
+ description: 'Claim a decomposed Foyer task for an external coding agent and fetch its implementation context.',
66
+ inputSchema: {
67
+ type: 'object',
68
+ required: ['taskId', 'agent'],
69
+ properties: {
70
+ taskId: { type: 'string' },
71
+ agent: {
72
+ type: 'string',
73
+ enum: ['claude-code', 'codex', 'cursor', 'windsurf', 'generic'],
74
+ },
75
+ metadata: { type: 'object' },
76
+ },
77
+ },
78
+ },
79
+ {
80
+ name: 'foyer_list_integration_tokens',
81
+ description: 'List org integration tokens (admin only).',
82
+ inputSchema: {
83
+ type: 'object',
84
+ required: ['orgId'],
85
+ properties: { orgId: { type: 'string' } },
86
+ },
87
+ },
88
+ ];
89
+ function textResult(value) {
90
+ return { content: [{ type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) }] };
91
+ }
92
+ function taskHandoffAgent(value) {
93
+ if (value === 'claude-code' || value === 'codex' || value === 'cursor' || value === 'windsurf' || value === 'generic') {
94
+ return value;
95
+ }
96
+ throw new Error(`Invalid agent: ${String(value)}`);
97
+ }
98
+ async function callTool(name, args) {
99
+ if (!process.env.FOYER_TOKEN)
100
+ throw new Error('FOYER_TOKEN is required');
101
+ switch (name) {
102
+ case 'foyer_create_feature_with_plan':
103
+ return textResult(await client.importPlan({
104
+ repoId: args.repoId,
105
+ workspaceId: args.workspaceId,
106
+ title: String(args.title ?? ''),
107
+ description: String(args.description ?? ''),
108
+ plan: String(args.plan ?? ''),
109
+ agentSource: String(args.agentSource ?? ''),
110
+ agentRunId: String(args.agentRunId ?? ''),
111
+ metadata: args.metadata,
112
+ }));
113
+ case 'foyer_get_feature':
114
+ return textResult(await client.getFeature(String(args.featureId ?? '')));
115
+ case 'foyer_update_plan':
116
+ return textResult(await client.updatePlan(String(args.featureId ?? ''), String(args.plan ?? '')));
117
+ case 'foyer_decompose_feature':
118
+ return textResult(await client.decomposeFeature(String(args.featureId ?? '')));
119
+ case 'foyer_list_comments':
120
+ return textResult(await client.listFeatureComments(String(args.featureId ?? '')));
121
+ case 'foyer_handoff_task':
122
+ return textResult(await client.handoffTask(String(args.taskId ?? ''), taskHandoffAgent(args.agent), args.metadata));
123
+ case 'foyer_list_integration_tokens':
124
+ return textResult(await client.listIntegrationTokens(String(args.orgId ?? '')));
125
+ default:
126
+ throw new Error(`Unknown tool: ${name}`);
127
+ }
128
+ }
129
+ async function handle(request) {
130
+ switch (request.method) {
131
+ case 'initialize':
132
+ return { protocolVersion: '2024-11-05', serverInfo: { name: 'foyer-mcp', version: '0.1.0' }, capabilities: { tools: {} } };
133
+ case 'tools/list':
134
+ return { tools };
135
+ case 'tools/call':
136
+ return callTool(String(request.params?.name ?? ''), (request.params?.arguments ?? {}));
137
+ default:
138
+ return {};
139
+ }
140
+ }
141
+ const rl = createInterface({ input: process.stdin, crlfDelay: Infinity });
142
+ rl.on('line', async (line) => {
143
+ if (!line.trim())
144
+ return;
145
+ const request = JSON.parse(line);
146
+ try {
147
+ const result = await handle(request);
148
+ process.stdout.write(`${JSON.stringify({ jsonrpc: '2.0', id: request.id ?? null, result })}\n`);
149
+ }
150
+ catch (err) {
151
+ process.stdout.write(`${JSON.stringify({
152
+ jsonrpc: '2.0',
153
+ id: request.id ?? null,
154
+ error: { code: -32000, message: err instanceof Error ? err.message : String(err) },
155
+ })}\n`);
156
+ }
157
+ });
158
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@getfoyer/mcp",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "foyer-mcp": "dist/index.js"
7
+ },
8
+ "files": [
9
+ "dist/index.js",
10
+ "dist/index.js.map",
11
+ "dist/index.d.ts",
12
+ "dist/index.d.ts.map"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "typecheck": "tsc --noEmit",
20
+ "test": "vitest run"
21
+ },
22
+ "dependencies": {
23
+ "@getfoyer/client": "0.1.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^22.0.0",
27
+ "typescript": "^5.7.0",
28
+ "vitest": "^4.1.2"
29
+ }
30
+ }