@fml-inc/fml 0.0.29 → 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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +10 -0
- package/dist/{chunk-TXQRKU2Y.js → chunk-CUBBYHH7.js} +92 -53
- package/dist/chunk-CUBBYHH7.js.map +1 -0
- package/dist/{chunk-RJOFOTNH.js → chunk-I5BHNW37.js} +6 -140
- package/dist/chunk-I5BHNW37.js.map +1 -0
- package/dist/cli.js +109 -1808
- package/dist/cli.js.map +1 -1
- package/dist/mcp/server.js +12 -9
- package/dist/mcp/server.js.map +1 -1
- package/dist/{token-store-NE7AM2PH.js → token-store-HOFFHNNN.js} +2 -2
- package/package.json +4 -4
- package/dist/chunk-2CRFCFE4.js +0 -11
- package/dist/chunk-2CRFCFE4.js.map +0 -1
- package/dist/chunk-NLFKYSN7.js +0 -640
- package/dist/chunk-NLFKYSN7.js.map +0 -1
- package/dist/chunk-RJOFOTNH.js.map +0 -1
- package/dist/chunk-TXQRKU2Y.js.map +0 -1
- package/dist/chunk-UALBZA5X.js +0 -123
- package/dist/chunk-UALBZA5X.js.map +0 -1
- package/dist/doctor-YV6KQEGW.js +0 -2019
- package/dist/doctor-YV6KQEGW.js.map +0 -1
- package/dist/esm-GTDP7OMQ-EP6UYLQG.js +0 -14442
- package/dist/esm-GTDP7OMQ-EP6UYLQG.js.map +0 -1
- /package/dist/{token-store-NE7AM2PH.js.map → token-store-HOFFHNNN.js.map} +0 -0
package/dist/mcp/server.js
CHANGED
|
@@ -3,16 +3,15 @@ import {
|
|
|
3
3
|
createApiClient,
|
|
4
4
|
ensureNativeModules,
|
|
5
5
|
getAuthenticatedClient
|
|
6
|
-
} from "../chunk-
|
|
7
|
-
import "../chunk-UALBZA5X.js";
|
|
6
|
+
} from "../chunk-I5BHNW37.js";
|
|
8
7
|
import {
|
|
9
|
-
AUTH_STORE_PATH,
|
|
10
8
|
Sentry,
|
|
9
|
+
authStorePath,
|
|
11
10
|
getSelectedOrg,
|
|
12
11
|
getValidToken,
|
|
13
12
|
initSentry,
|
|
14
13
|
readTokens
|
|
15
|
-
} from "../chunk-
|
|
14
|
+
} from "../chunk-CUBBYHH7.js";
|
|
16
15
|
import {
|
|
17
16
|
parsePanopticonRunning
|
|
18
17
|
} from "../chunk-YIWT7BWN.js";
|
|
@@ -21,7 +20,6 @@ import {
|
|
|
21
20
|
FML_DATA_DIR,
|
|
22
21
|
FML_LOG_DIR
|
|
23
22
|
} from "../chunk-4YEAQJPF.js";
|
|
24
|
-
import "../chunk-2CRFCFE4.js";
|
|
25
23
|
import "../chunk-PZ5AY32C.js";
|
|
26
24
|
|
|
27
25
|
// src/mcp/server.ts
|
|
@@ -235,6 +233,12 @@ function registerTools(server2) {
|
|
|
235
233
|
mastraId: "integration-freshdesk",
|
|
236
234
|
description: "Query and manage customer support tickets in Freshdesk. Common endpoints: 'tickets' (GET), 'tickets/{id}' (GET).",
|
|
237
235
|
endpointHelp: "Freshdesk REST API v2 endpoint, e.g. 'tickets', 'tickets/{id}'"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
name: "fml_query_stripe",
|
|
239
|
+
mastraId: "integration-stripe",
|
|
240
|
+
description: "Query Stripe API for customers, subscriptions, charges, invoices, and revenue. Common endpoints: 'customers' (GET), 'subscriptions?status=active' (GET), 'charges' (GET), 'invoices' (GET), 'balance' (GET).",
|
|
241
|
+
endpointHelp: "Stripe REST API v1 endpoint, e.g. 'customers', 'subscriptions?status=active', 'charges', 'balance'"
|
|
238
242
|
}
|
|
239
243
|
];
|
|
240
244
|
for (const tool of integrationTools) {
|
|
@@ -450,15 +454,14 @@ async function main() {
|
|
|
450
454
|
const tokens = readTokens();
|
|
451
455
|
const tokenValid = tokens ? await getValidToken() : null;
|
|
452
456
|
if (!tokens) {
|
|
457
|
+
const storePath = authStorePath();
|
|
453
458
|
try {
|
|
454
459
|
const files = fs.readdirSync(FML_DATA_DIR).join(", ") || "(empty)";
|
|
455
460
|
console.error(
|
|
456
|
-
`[fml] No auth file at ${
|
|
461
|
+
`[fml] No auth file at ${storePath}. Dir contents: ${files}`
|
|
457
462
|
);
|
|
458
463
|
} catch {
|
|
459
|
-
console.error(
|
|
460
|
-
`[fml] No auth file at ${AUTH_STORE_PATH}. Dir not readable.`
|
|
461
|
-
);
|
|
464
|
+
console.error(`[fml] No auth file at ${storePath}. Dir not readable.`);
|
|
462
465
|
}
|
|
463
466
|
server.resource("setup", "fml://setup", async () => ({
|
|
464
467
|
contents: [
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/server.ts","../../src/mcp/tools.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { ensureNativeModules } from \"../native-check.js\";\nensureNativeModules();\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { registerTools } from \"./tools.js\";\nimport { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { AUTH_STORE_PATH } from \"../config.js\";\nimport { initSentry, Sentry } from \"../sentry.js\";\nimport { parsePanopticonRunning } from \"../commands/daemon.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\n\nconst LOG_PATH = path.join(FML_LOG_DIR, \"mcp.log\");\n\nconst server = new McpServer({\n name: \"fml\",\n version: \"0.1.0\",\n});\n\nregisterTools(server);\n\nasync function main() {\n await initSentry();\n\n // Redirect stderr to log file (stdout is reserved for MCP JSON-RPC protocol)\n if (!fs.existsSync(FML_LOG_DIR)) {\n fs.mkdirSync(FML_LOG_DIR, { recursive: true });\n }\n const logFd = fs.openSync(LOG_PATH, \"a\");\n const logStream = fs.createWriteStream(\"\", { fd: logFd });\n process.stderr.write = logStream.write.bind(\n logStream,\n ) as typeof process.stderr.write;\n\n // Check auth state and surface setup prompts\n const tokens = readTokens();\n const tokenValid = tokens ? await getValidToken() : null;\n\n if (!tokens) {\n try {\n const files = fs.readdirSync(FML_DATA_DIR).join(\", \") || \"(empty)\";\n console.error(\n `[fml] No auth file at ${AUTH_STORE_PATH}. Dir contents: ${files}`,\n );\n } catch {\n console.error(\n `[fml] No auth file at ${AUTH_STORE_PATH}. Dir not readable.`,\n );\n }\n server.resource(\"setup\", \"fml://setup\", async () => ({\n contents: [\n {\n uri: \"fml://setup\",\n text: \"FML plugin is not authenticated. Run `fml login` in your terminal to sign in, then restart Claude Code.\",\n },\n ],\n }));\n console.error(\"[fml] Not authenticated — run `fml login`\");\n } else if (!tokenValid) {\n console.error(\"[fml] Token expired — run `fml login` to re-authenticate\");\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Ensure panopticon is running (includes sync, which handles config snapshots)\n if (!parsePanopticonRunning()) {\n try {\n const { handleStart } = await import(\"../commands/daemon.js\");\n await handleStart();\n } catch {\n console.error(\n \"[fml] Warning: could not start panopticon. Run `fml start` manually\",\n );\n }\n }\n}\n\nmain().catch((err) => {\n Sentry.captureException(err);\n console.error(\"FML MCP server error:\", err);\n process.exit(1);\n});\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n getSelectedOrg,\n getValidToken,\n readTokens,\n} from \"../auth/token-store.js\";\nimport { createApiClient, getAuthenticatedClient } from \"../convex-client.js\";\nimport { Sentry } from \"../sentry.js\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction textResult(data: unknown) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n };\n}\n\nfunction errorResult(message: string) {\n return {\n content: [{ type: \"text\" as const, text: message }],\n isError: true,\n };\n}\n\nconst PANOPTICON_HINT =\n \"\\n\\nFor local data, use the panopticon MCP tools instead (e.g. panopticon__sessions, panopticon__costs, panopticon__search, panopticon__timeline).\";\n\nasync function toolHandler(toolName: string, args: Record<string, unknown>) {\n try {\n const api = await getAuthenticatedClient();\n if (!api) {\n return errorResult(\n \"Not authenticated. Run `fml login` to sign in, then restart Claude Code.\" +\n PANOPTICON_HINT,\n );\n }\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n return errorResult((result.error ?? \"Unknown error\") + PANOPTICON_HINT);\n }\n return textResult(result.result);\n } catch (err) {\n Sentry.captureException(err);\n const msg = err instanceof Error ? err.message : String(err);\n return errorResult(`Unexpected error: ${msg}` + PANOPTICON_HINT);\n }\n}\n\n// ─── Registration ─────────────────────────────────────────────────────────────\n\nexport function registerTools(server: McpServer): void {\n server.tool(\n \"whoami\",\n \"Show current authenticated user and available organizations\",\n {},\n async () => {\n const tokens = readTokens();\n const token = tokens ? await getValidToken() : null;\n let orgs = null;\n if (token) {\n try {\n orgs = await createApiClient(token).queryOrgs();\n } catch {}\n }\n return textResult({\n authenticated: !!tokens,\n user: tokens?.user ?? null,\n orgs,\n });\n },\n );\n\n // ── Messages ───────────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_list_messages\",\n \"List messages from a conversation within a time range. Requires a conversationId from the FML web app.\",\n {\n startTime: z\n .number()\n .optional()\n .describe(\n \"Start time in milliseconds (inclusive). Omit to start from beginning.\",\n ),\n endTime: z\n .number()\n .optional()\n .describe(\n \"End time in milliseconds (inclusive). Omit to include up to most recent.\",\n ),\n limit: z\n .number()\n .optional()\n .describe(\n \"Maximum number of messages to return per page (default: 20)\",\n ),\n cursor: z\n .string()\n .optional()\n .describe(\"Pagination cursor from previous result to get next page\"),\n },\n async (args) => toolHandler(\"list-messages\", args),\n );\n\n server.tool(\n \"fml_list_messages_with_context\",\n \"Get messages around a specific message to see the context. Takes a message ID and returns messages before and after it.\",\n {\n messageId: z\n .string()\n .describe(\"The ID of the target message to get context around\"),\n before: z\n .number()\n .optional()\n .describe(\n \"Number of messages to retrieve before the target (default: 5)\",\n ),\n after: z\n .number()\n .optional()\n .describe(\n \"Number of messages to retrieve after the target (default: 5)\",\n ),\n },\n async (args) => toolHandler(\"list-messages-with-context\", args),\n );\n\n // ── Slack ──────────────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_get_slack_channel_history\",\n \"Fetch recent message history from a Slack channel. Requires Slack integration to be connected.\",\n {\n channelId: z\n .string()\n .optional()\n .describe(\n \"Slack channel ID (e.g. C0123ABC). If omitted, uses the channel from the current Slack-sourced conversation.\",\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Number of messages to fetch (default 20, max 50)\"),\n },\n async (args) => toolHandler(\"get-slack-channel-history\", args),\n );\n\n server.tool(\n \"fml_get_slack_message\",\n \"Fetch a specific Slack message by timestamp or permalink. Requires Slack integration to be connected.\",\n {\n permalink: z\n .string()\n .optional()\n .describe(\n \"Slack message permalink. If provided, channelId and messageTs are ignored.\",\n ),\n channelId: z\n .string()\n .optional()\n .describe(\n \"Slack channel ID (e.g. C0123ABC). Required if permalink not provided.\",\n ),\n messageTs: z\n .string()\n .optional()\n .describe(\n \"Message timestamp (e.g. 1234567890.123456). Required if permalink not provided.\",\n ),\n includeThreadContext: z\n .boolean()\n .optional()\n .describe(\n \"If true, fetches thread replies along with the message (default false)\",\n ),\n },\n async (args) => toolHandler(\"get-slack-message\", args),\n );\n\n // ── Skills ─────────────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_list_skills\",\n \"List all available FML skills. Skills provide detailed knowledge about FML features.\",\n {},\n async () => toolHandler(\"list-skills\", {}),\n );\n\n server.tool(\n \"fml_load_skill\",\n \"Load a skill prompt by ID. Skills provide detailed knowledge about FML features.\",\n {\n skillId: z\n .string()\n .describe(\"The skill ID to load (e.g., 'fml-help', 'fml-navigation')\"),\n },\n async (args) => toolHandler(\"load-skill\", args),\n );\n\n // ── Analysis ───────────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_search_analysis\",\n \"Search analysis results. USE FOR: finding analyses by topic, type, or status. RETURNS: full analysis content.\",\n {\n query: z\n .string()\n .optional()\n .describe(\"Text search across analysis type and content\"),\n promptKey: z\n .string()\n .optional()\n .describe(\"Exact filter by analysis type (e.g., 'analyze-codebase')\"),\n status: z\n .enum([\"complete\", \"running\", \"created\", \"failed\"])\n .optional()\n .describe(\"Filter by status\"),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of results to return (default 20)\"),\n },\n async (args) => toolHandler(\"search-analysis\", args),\n );\n\n server.tool(\n \"fml_run_analysis_workflow\",\n \"Run comprehensive codebase analysis workflows. Available prompts: deep_security_auditor, deep_architecture_auditor, deep_code_quality_auditor, deep_performance_auditor, deep_ux_auditor, deep_dependencies_auditor, deep_cost_auditor, deep_ai_architecture_integration, deep_ai_security.\",\n {\n selectedPromptKeys: z\n .array(\n z.enum([\n \"deep_security_auditor\",\n \"deep_architecture_auditor\",\n \"deep_code_quality_auditor\",\n \"deep_performance_auditor\",\n \"deep_ux_auditor\",\n \"deep_dependencies_auditor\",\n \"deep_cost_auditor\",\n \"deep_ai_architecture_integration\",\n \"deep_ai_security\",\n ]),\n )\n .optional()\n .describe(\n \"Array of specific analysis prompts to run. If not provided, runs default set.\",\n ),\n },\n async (args) => toolHandler(\"run-analysis-workflow\", args),\n );\n\n // ── Integrations ───────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_list_integrations\",\n \"List integrations for this project — both connected and available. Use to check what integrations are active.\",\n {},\n async () => toolHandler(\"list-integrations\", {}),\n );\n\n // Integration query tools\n const integrationTools: Array<{\n name: string;\n mastraId: string;\n description: string;\n endpointHelp: string;\n }> = [\n {\n name: \"fml_query_sentry\",\n mastraId: \"integration-sentry\",\n description:\n \"Look up production errors, exceptions, and crash data from Sentry. Common endpoints: 'organizations/{orgSlug}/issues/' (GET), 'issues/{issue_id}/' (GET). {orgSlug} is auto-substituted.\",\n endpointHelp:\n \"Sentry REST API endpoint. {orgSlug} is auto-substituted. e.g. 'organizations/{orgSlug}/issues/'\",\n },\n {\n name: \"fml_query_slack\",\n mastraId: \"integration-slack\",\n description:\n \"Send messages and read channel/user info from Slack. Use channel IDs not names. Common endpoints: 'conversations.list' (GET), 'chat.postMessage' (POST).\",\n endpointHelp:\n \"Slack API method, e.g. 'conversations.list', 'chat.postMessage'\",\n },\n {\n name: \"fml_query_github\",\n mastraId: \"integration-github\",\n description:\n \"Query repository activity from GitHub — PRs, commits, issues, code. {owner} and {repo} are auto-substituted. Common endpoints: 'repos/{owner}/{repo}/pulls' (GET).\",\n endpointHelp: \"GitHub REST API path. e.g. 'repos/{owner}/{repo}/pulls'\",\n },\n {\n name: \"fml_query_linear\",\n mastraId: \"integration-linear\",\n description:\n \"Query and manage Linear issues and projects via GraphQL. Endpoint is always 'graphql', method POST.\",\n endpointHelp:\n \"Linear GraphQL endpoint — always use 'graphql' with method POST and {query, variables} in body\",\n },\n {\n name: \"fml_query_notion\",\n mastraId: \"integration-notion\",\n description:\n \"Search pages, query databases, read and write content in Notion. Common endpoints: 'search' (POST), 'databases/{id}/query' (POST).\",\n endpointHelp:\n \"Notion REST API endpoint, e.g. 'search', 'databases/{database_id}/query'\",\n },\n {\n name: \"fml_query_freshdesk\",\n mastraId: \"integration-freshdesk\",\n description:\n \"Query and manage customer support tickets in Freshdesk. Common endpoints: 'tickets' (GET), 'tickets/{id}' (GET).\",\n endpointHelp:\n \"Freshdesk REST API v2 endpoint, e.g. 'tickets', 'tickets/{id}'\",\n },\n ];\n\n for (const tool of integrationTools) {\n server.tool(\n tool.name,\n tool.description,\n {\n endpoint: z.string().describe(tool.endpointHelp),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"])\n .optional()\n .describe(\"HTTP method. Defaults to GET.\"),\n body: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Request body as a JSON object (for POST/PUT/PATCH)\"),\n projectId: z\n .string()\n .optional()\n .describe(\n \"Optional project ID to scope this query. Required for GitHub (needs repo context).\",\n ),\n },\n async (args) => toolHandler(tool.mastraId, args),\n );\n }\n\n // ── Engineering Activity ───────────────────────────────────────────────────\n\n server.tool(\n \"get_engineering_activity\",\n \"Get agent activity summary (Claude Code, Codex, Gemini CLI, Mastra). SCOPES: 'org' (default), 'project', or 'user' (by githubUsername).\",\n {\n timeRange: z\n .enum([\"1h\", \"6h\", \"24h\", \"7d\", \"30d\"])\n .optional()\n .describe(\"Preset time range. Default '7d'.\"),\n since: z\n .string()\n .optional()\n .describe(\"ISO 8601 start timestamp. Overrides timeRange.\"),\n until: z.string().optional().describe(\"ISO 8601 end timestamp.\"),\n target: z\n .enum([\"claude\", \"codex\", \"gemini\", \"mastra\"])\n .optional()\n .describe(\"Filter by agent type. Omit for all.\"),\n scope: z\n .enum([\"org\", \"project\", \"user\"])\n .optional()\n .describe(\"Query scope. 'org' (default), 'project', or 'user'.\"),\n githubUsername: z\n .string()\n .optional()\n .describe(\"Required when scope is 'user'. GitHub username.\"),\n },\n async (args) => toolHandler(\"get-engineering-activity\", args),\n );\n\n server.tool(\n \"list_engineering_sessions\",\n \"List agent sessions (Claude Code, Codex, Gemini CLI, Mastra). Each session includes first prompt preview and event counts.\",\n {\n scope: z\n .enum([\"org\", \"project\"])\n .optional()\n .describe(\"Query scope. Default 'org'.\"),\n target: z\n .enum([\"claude\", \"codex\", \"gemini\", \"mastra\"])\n .optional()\n .describe(\"Filter by agent type. Omit for all.\"),\n githubUsername: z\n .string()\n .optional()\n .describe(\"Filter to sessions by this GitHub username.\"),\n timeRange: z.enum([\"1h\", \"6h\", \"24h\", \"7d\", \"30d\"]).optional(),\n since: z.string().optional().describe(\"ISO 8601 start timestamp.\"),\n until: z.string().optional().describe(\"ISO 8601 end timestamp.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Max sessions to return (default 20, max 50).\"),\n },\n async (args) => toolHandler(\"list-engineering-sessions\", args),\n );\n\n server.tool(\n \"get_session_timeline\",\n 'Get chronological timeline for a coding agent session. Returns messages and/or hook events interleaved by timestamp. Use source=\"hooks\" to see permission requests, tool approvals, etc. REQUIRES: sessionId from list_engineering_sessions.',\n {\n sessionId: z.string().describe(\"The session ID to get details for.\"),\n includeSystemMessages: z\n .boolean()\n .optional()\n .describe(\"Include system messages (default false).\"),\n source: z\n .enum([\"messages\", \"hooks\", \"all\"])\n .optional()\n .describe(\n 'Filter by source: \"messages\" (scanner messages only), \"hooks\" (hook events only), \"all\" (both interleaved). Default \"all\".',\n ),\n eventType: z\n .string()\n .optional()\n .describe(\n 'Filter hook events by type (e.g. \"PermissionRequest\", \"PreToolUse\", \"Stop\"). Only applies when source includes hooks.',\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Max entries to return (default 50, max 200).\"),\n offset: z\n .number()\n .optional()\n .describe(\"Skip first N entries for pagination.\"),\n },\n async (args) => toolHandler(\"get-session-timeline\", args),\n );\n\n server.tool(\n \"get_session_turns\",\n \"Get per-turn token accounting for a coding agent session. USE FOR: understanding cost per turn, model used at each step, cache hit analysis. REQUIRES: sessionId from list_engineering_sessions.\",\n {\n sessionId: z.string().describe(\"The session ID to get turns for.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Max turns to return (default 50, max 200).\"),\n offset: z\n .number()\n .optional()\n .describe(\"Skip first N turns for pagination.\"),\n },\n async (args) => toolHandler(\"get-session-turns\", args),\n );\n\n server.tool(\n \"get_ai_spending\",\n \"Get AI spending and token usage data. Groups by 'session' (default), 'model', or 'day'.\",\n {\n timeRange: z\n .enum([\"1h\", \"6h\", \"24h\", \"7d\", \"30d\"])\n .optional()\n .describe(\"Default '7d'.\"),\n since: z.string().optional().describe(\"ISO 8601 start timestamp.\"),\n until: z.string().optional().describe(\"ISO 8601 end timestamp.\"),\n groupBy: z\n .enum([\"session\", \"model\", \"day\"])\n .optional()\n .describe(\"How to group results.\"),\n target: z\n .enum([\"claude\", \"codex\", \"gemini\", \"mastra\"])\n .optional()\n .describe(\"Filter by agent type. Omit for all.\"),\n },\n async (args) => toolHandler(\"get-ai-spending\", args),\n );\n\n server.tool(\n \"search_engineering_sessions\",\n \"Search across agent sessions by text. Searches prompts, tool names, and event payloads.\",\n {\n query: z.string().describe(\"Text to search for. Case-insensitive.\"),\n timeRange: z.enum([\"1h\", \"6h\", \"24h\", \"7d\", \"30d\"]).optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n target: z\n .enum([\"claude\", \"codex\", \"gemini\", \"mastra\"])\n .optional()\n .describe(\"Filter by agent type. Omit for all.\"),\n limit: z.number().optional().describe(\"Max results (default 20).\"),\n },\n async (args) => toolHandler(\"search-engineering-sessions\", args),\n );\n\n // ── Config Snapshots ────────────────────────────────────────────────────\n\n server.tool(\n \"list_user_configs\",\n \"List user-level configuration snapshots (CLAUDE.md, settings, etc.) across the org. Shows who has configs and when they were last updated.\",\n {},\n async () => {\n try {\n const orgSlug = getSelectedOrg();\n if (!orgSlug) return errorResult(\"No org selected. Run `fml login`.\");\n const api = await getAuthenticatedClient();\n if (!api) return errorResult(\"Not authenticated. Run `fml login`.\");\n const result = await api.listUserConfigSnapshots(orgSlug);\n return textResult(result);\n } catch (err) {\n Sentry.captureException(err);\n return errorResult(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n );\n\n server.tool(\n \"get_user_config\",\n \"Get detailed user configuration for a specific GitHub user — their CLAUDE.md, settings.json, MCP servers, etc.\",\n {\n githubUsername: z.string().describe(\"GitHub username to look up.\"),\n },\n async (args) => {\n try {\n const orgSlug = getSelectedOrg();\n if (!orgSlug) return errorResult(\"No org selected. Run `fml login`.\");\n const api = await getAuthenticatedClient();\n if (!api) return errorResult(\"Not authenticated. Run `fml login`.\");\n const result = await api.getUserConfigDetail(\n orgSlug,\n args.githubUsername,\n );\n if (!result)\n return errorResult(`No config found for ${args.githubUsername}.`);\n return textResult(result);\n } catch (err) {\n Sentry.captureException(err);\n return errorResult(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n );\n\n server.tool(\n \"list_repo_configs\",\n \"List repository-level configuration snapshots (CLAUDE.md, .mcp.json, etc.) across the org. Optionally filter by repository.\",\n {\n repository: z\n .string()\n .optional()\n .describe(\"Filter by repository full name (e.g. 'org/repo').\"),\n },\n async (args) => {\n try {\n const orgSlug = getSelectedOrg();\n if (!orgSlug) return errorResult(\"No org selected. Run `fml login`.\");\n const api = await getAuthenticatedClient();\n if (!api) return errorResult(\"Not authenticated. Run `fml login`.\");\n const result = await api.listRepoConfigSnapshots(\n orgSlug,\n args.repository,\n );\n return textResult(result);\n } catch (err) {\n Sentry.captureException(err);\n return errorResult(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n );\n\n server.tool(\n \"get_repo_config\",\n \"Get detailed repository configuration — CLAUDE.md files, .mcp.json, and other agent config found in a specific repo.\",\n {\n repository: z\n .string()\n .describe(\"Repository full name (e.g. 'org/repo').\"),\n },\n async (args) => {\n try {\n const orgSlug = getSelectedOrg();\n if (!orgSlug) return errorResult(\"No org selected. Run `fml login`.\");\n const api = await getAuthenticatedClient();\n if (!api) return errorResult(\"Not authenticated. Run `fml login`.\");\n const result = await api.getRepoConfigDetail(orgSlug, args.repository);\n if (!result)\n return errorResult(`No config found for ${args.repository}.`);\n return textResult(result);\n } catch (err) {\n Sentry.captureException(err);\n return errorResult(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n );\n}\n"],"mappings":"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","names":["server"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/server.ts","../../src/mcp/tools.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { ensureNativeModules } from \"../native-check.js\";\nensureNativeModules();\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { registerTools } from \"./tools.js\";\nimport { getValidToken, readTokens } from \"../auth/token-store.js\";\nimport { authStorePath } from \"../config.js\";\nimport { initSentry, Sentry } from \"../sentry.js\";\nimport { parsePanopticonRunning } from \"../commands/daemon.js\";\nimport { FML_DATA_DIR, FML_LOG_DIR } from \"../dirs.js\";\n\nconst LOG_PATH = path.join(FML_LOG_DIR, \"mcp.log\");\n\nconst server = new McpServer({\n name: \"fml\",\n version: \"0.1.0\",\n});\n\nregisterTools(server);\n\nasync function main() {\n await initSentry();\n\n // Redirect stderr to log file (stdout is reserved for MCP JSON-RPC protocol)\n if (!fs.existsSync(FML_LOG_DIR)) {\n fs.mkdirSync(FML_LOG_DIR, { recursive: true });\n }\n const logFd = fs.openSync(LOG_PATH, \"a\");\n const logStream = fs.createWriteStream(\"\", { fd: logFd });\n process.stderr.write = logStream.write.bind(\n logStream,\n ) as typeof process.stderr.write;\n\n // Check auth state and surface setup prompts\n const tokens = readTokens();\n const tokenValid = tokens ? await getValidToken() : null;\n\n if (!tokens) {\n const storePath = authStorePath();\n try {\n const files = fs.readdirSync(FML_DATA_DIR).join(\", \") || \"(empty)\";\n console.error(\n `[fml] No auth file at ${storePath}. Dir contents: ${files}`,\n );\n } catch {\n console.error(`[fml] No auth file at ${storePath}. Dir not readable.`);\n }\n server.resource(\"setup\", \"fml://setup\", async () => ({\n contents: [\n {\n uri: \"fml://setup\",\n text: \"FML plugin is not authenticated. Run `fml login` in your terminal to sign in, then restart Claude Code.\",\n },\n ],\n }));\n console.error(\"[fml] Not authenticated — run `fml login`\");\n } else if (!tokenValid) {\n console.error(\"[fml] Token expired — run `fml login` to re-authenticate\");\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n // Ensure panopticon is running (includes sync, which handles config snapshots)\n if (!parsePanopticonRunning()) {\n try {\n const { handleStart } = await import(\"../commands/daemon.js\");\n await handleStart();\n } catch {\n console.error(\n \"[fml] Warning: could not start panopticon. Run `fml start` manually\",\n );\n }\n }\n}\n\nmain().catch((err) => {\n Sentry.captureException(err);\n console.error(\"FML MCP server error:\", err);\n process.exit(1);\n});\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n getSelectedOrg,\n getValidToken,\n readTokens,\n} from \"../auth/token-store.js\";\nimport { createApiClient, getAuthenticatedClient } from \"../convex-client.js\";\nimport { Sentry } from \"../sentry.js\";\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction textResult(data: unknown) {\n return {\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\n };\n}\n\nfunction errorResult(message: string) {\n return {\n content: [{ type: \"text\" as const, text: message }],\n isError: true,\n };\n}\n\nconst PANOPTICON_HINT =\n \"\\n\\nFor local data, use the panopticon MCP tools instead (e.g. panopticon__sessions, panopticon__costs, panopticon__search, panopticon__timeline).\";\n\nasync function toolHandler(toolName: string, args: Record<string, unknown>) {\n try {\n const api = await getAuthenticatedClient();\n if (!api) {\n return errorResult(\n \"Not authenticated. Run `fml login` to sign in, then restart Claude Code.\" +\n PANOPTICON_HINT,\n );\n }\n const result = await api.callBackend(toolName, args);\n if (!result.ok) {\n return errorResult((result.error ?? \"Unknown error\") + PANOPTICON_HINT);\n }\n return textResult(result.result);\n } catch (err) {\n Sentry.captureException(err);\n const msg = err instanceof Error ? err.message : String(err);\n return errorResult(`Unexpected error: ${msg}` + PANOPTICON_HINT);\n }\n}\n\n// ─── Registration ─────────────────────────────────────────────────────────────\n\nexport function registerTools(server: McpServer): void {\n server.tool(\n \"whoami\",\n \"Show current authenticated user and available organizations\",\n {},\n async () => {\n const tokens = readTokens();\n const token = tokens ? await getValidToken() : null;\n let orgs = null;\n if (token) {\n try {\n orgs = await createApiClient(token).queryOrgs();\n } catch {}\n }\n return textResult({\n authenticated: !!tokens,\n user: tokens?.user ?? null,\n orgs,\n });\n },\n );\n\n // ── Messages ───────────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_list_messages\",\n \"List messages from a conversation within a time range. Requires a conversationId from the FML web app.\",\n {\n startTime: z\n .number()\n .optional()\n .describe(\n \"Start time in milliseconds (inclusive). Omit to start from beginning.\",\n ),\n endTime: z\n .number()\n .optional()\n .describe(\n \"End time in milliseconds (inclusive). Omit to include up to most recent.\",\n ),\n limit: z\n .number()\n .optional()\n .describe(\n \"Maximum number of messages to return per page (default: 20)\",\n ),\n cursor: z\n .string()\n .optional()\n .describe(\"Pagination cursor from previous result to get next page\"),\n },\n async (args) => toolHandler(\"list-messages\", args),\n );\n\n server.tool(\n \"fml_list_messages_with_context\",\n \"Get messages around a specific message to see the context. Takes a message ID and returns messages before and after it.\",\n {\n messageId: z\n .string()\n .describe(\"The ID of the target message to get context around\"),\n before: z\n .number()\n .optional()\n .describe(\n \"Number of messages to retrieve before the target (default: 5)\",\n ),\n after: z\n .number()\n .optional()\n .describe(\n \"Number of messages to retrieve after the target (default: 5)\",\n ),\n },\n async (args) => toolHandler(\"list-messages-with-context\", args),\n );\n\n // ── Slack ──────────────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_get_slack_channel_history\",\n \"Fetch recent message history from a Slack channel. Requires Slack integration to be connected.\",\n {\n channelId: z\n .string()\n .optional()\n .describe(\n \"Slack channel ID (e.g. C0123ABC). If omitted, uses the channel from the current Slack-sourced conversation.\",\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Number of messages to fetch (default 20, max 50)\"),\n },\n async (args) => toolHandler(\"get-slack-channel-history\", args),\n );\n\n server.tool(\n \"fml_get_slack_message\",\n \"Fetch a specific Slack message by timestamp or permalink. Requires Slack integration to be connected.\",\n {\n permalink: z\n .string()\n .optional()\n .describe(\n \"Slack message permalink. If provided, channelId and messageTs are ignored.\",\n ),\n channelId: z\n .string()\n .optional()\n .describe(\n \"Slack channel ID (e.g. C0123ABC). Required if permalink not provided.\",\n ),\n messageTs: z\n .string()\n .optional()\n .describe(\n \"Message timestamp (e.g. 1234567890.123456). Required if permalink not provided.\",\n ),\n includeThreadContext: z\n .boolean()\n .optional()\n .describe(\n \"If true, fetches thread replies along with the message (default false)\",\n ),\n },\n async (args) => toolHandler(\"get-slack-message\", args),\n );\n\n // ── Skills ─────────────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_list_skills\",\n \"List all available FML skills. Skills provide detailed knowledge about FML features.\",\n {},\n async () => toolHandler(\"list-skills\", {}),\n );\n\n server.tool(\n \"fml_load_skill\",\n \"Load a skill prompt by ID. Skills provide detailed knowledge about FML features.\",\n {\n skillId: z\n .string()\n .describe(\"The skill ID to load (e.g., 'fml-help', 'fml-navigation')\"),\n },\n async (args) => toolHandler(\"load-skill\", args),\n );\n\n // ── Analysis ───────────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_search_analysis\",\n \"Search analysis results. USE FOR: finding analyses by topic, type, or status. RETURNS: full analysis content.\",\n {\n query: z\n .string()\n .optional()\n .describe(\"Text search across analysis type and content\"),\n promptKey: z\n .string()\n .optional()\n .describe(\"Exact filter by analysis type (e.g., 'analyze-codebase')\"),\n status: z\n .enum([\"complete\", \"running\", \"created\", \"failed\"])\n .optional()\n .describe(\"Filter by status\"),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of results to return (default 20)\"),\n },\n async (args) => toolHandler(\"search-analysis\", args),\n );\n\n server.tool(\n \"fml_run_analysis_workflow\",\n \"Run comprehensive codebase analysis workflows. Available prompts: deep_security_auditor, deep_architecture_auditor, deep_code_quality_auditor, deep_performance_auditor, deep_ux_auditor, deep_dependencies_auditor, deep_cost_auditor, deep_ai_architecture_integration, deep_ai_security.\",\n {\n selectedPromptKeys: z\n .array(\n z.enum([\n \"deep_security_auditor\",\n \"deep_architecture_auditor\",\n \"deep_code_quality_auditor\",\n \"deep_performance_auditor\",\n \"deep_ux_auditor\",\n \"deep_dependencies_auditor\",\n \"deep_cost_auditor\",\n \"deep_ai_architecture_integration\",\n \"deep_ai_security\",\n ]),\n )\n .optional()\n .describe(\n \"Array of specific analysis prompts to run. If not provided, runs default set.\",\n ),\n },\n async (args) => toolHandler(\"run-analysis-workflow\", args),\n );\n\n // ── Integrations ───────────────────────────────────────────────────────────\n\n server.tool(\n \"fml_list_integrations\",\n \"List integrations for this project — both connected and available. Use to check what integrations are active.\",\n {},\n async () => toolHandler(\"list-integrations\", {}),\n );\n\n // Integration query tools\n const integrationTools: Array<{\n name: string;\n mastraId: string;\n description: string;\n endpointHelp: string;\n }> = [\n {\n name: \"fml_query_sentry\",\n mastraId: \"integration-sentry\",\n description:\n \"Look up production errors, exceptions, and crash data from Sentry. Common endpoints: 'organizations/{orgSlug}/issues/' (GET), 'issues/{issue_id}/' (GET). {orgSlug} is auto-substituted.\",\n endpointHelp:\n \"Sentry REST API endpoint. {orgSlug} is auto-substituted. e.g. 'organizations/{orgSlug}/issues/'\",\n },\n {\n name: \"fml_query_slack\",\n mastraId: \"integration-slack\",\n description:\n \"Send messages and read channel/user info from Slack. Use channel IDs not names. Common endpoints: 'conversations.list' (GET), 'chat.postMessage' (POST).\",\n endpointHelp:\n \"Slack API method, e.g. 'conversations.list', 'chat.postMessage'\",\n },\n {\n name: \"fml_query_github\",\n mastraId: \"integration-github\",\n description:\n \"Query repository activity from GitHub — PRs, commits, issues, code. {owner} and {repo} are auto-substituted. Common endpoints: 'repos/{owner}/{repo}/pulls' (GET).\",\n endpointHelp: \"GitHub REST API path. e.g. 'repos/{owner}/{repo}/pulls'\",\n },\n {\n name: \"fml_query_linear\",\n mastraId: \"integration-linear\",\n description:\n \"Query and manage Linear issues and projects via GraphQL. Endpoint is always 'graphql', method POST.\",\n endpointHelp:\n \"Linear GraphQL endpoint — always use 'graphql' with method POST and {query, variables} in body\",\n },\n {\n name: \"fml_query_notion\",\n mastraId: \"integration-notion\",\n description:\n \"Search pages, query databases, read and write content in Notion. Common endpoints: 'search' (POST), 'databases/{id}/query' (POST).\",\n endpointHelp:\n \"Notion REST API endpoint, e.g. 'search', 'databases/{database_id}/query'\",\n },\n {\n name: \"fml_query_freshdesk\",\n mastraId: \"integration-freshdesk\",\n description:\n \"Query and manage customer support tickets in Freshdesk. Common endpoints: 'tickets' (GET), 'tickets/{id}' (GET).\",\n endpointHelp:\n \"Freshdesk REST API v2 endpoint, e.g. 'tickets', 'tickets/{id}'\",\n },\n {\n name: \"fml_query_stripe\",\n mastraId: \"integration-stripe\",\n description:\n \"Query Stripe API for customers, subscriptions, charges, invoices, and revenue. Common endpoints: 'customers' (GET), 'subscriptions?status=active' (GET), 'charges' (GET), 'invoices' (GET), 'balance' (GET).\",\n endpointHelp:\n \"Stripe REST API v1 endpoint, e.g. 'customers', 'subscriptions?status=active', 'charges', 'balance'\",\n },\n ];\n\n for (const tool of integrationTools) {\n server.tool(\n tool.name,\n tool.description,\n {\n endpoint: z.string().describe(tool.endpointHelp),\n method: z\n .enum([\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"])\n .optional()\n .describe(\"HTTP method. Defaults to GET.\"),\n body: z\n .record(z.string(), z.unknown())\n .optional()\n .describe(\"Request body as a JSON object (for POST/PUT/PATCH)\"),\n projectId: z\n .string()\n .optional()\n .describe(\n \"Optional project ID to scope this query. Required for GitHub (needs repo context).\",\n ),\n },\n async (args) => toolHandler(tool.mastraId, args),\n );\n }\n\n // ── Engineering Activity ───────────────────────────────────────────────────\n\n server.tool(\n \"get_engineering_activity\",\n \"Get agent activity summary (Claude Code, Codex, Gemini CLI, Mastra). SCOPES: 'org' (default), 'project', or 'user' (by githubUsername).\",\n {\n timeRange: z\n .enum([\"1h\", \"6h\", \"24h\", \"7d\", \"30d\"])\n .optional()\n .describe(\"Preset time range. Default '7d'.\"),\n since: z\n .string()\n .optional()\n .describe(\"ISO 8601 start timestamp. Overrides timeRange.\"),\n until: z.string().optional().describe(\"ISO 8601 end timestamp.\"),\n target: z\n .enum([\"claude\", \"codex\", \"gemini\", \"mastra\"])\n .optional()\n .describe(\"Filter by agent type. Omit for all.\"),\n scope: z\n .enum([\"org\", \"project\", \"user\"])\n .optional()\n .describe(\"Query scope. 'org' (default), 'project', or 'user'.\"),\n githubUsername: z\n .string()\n .optional()\n .describe(\"Required when scope is 'user'. GitHub username.\"),\n },\n async (args) => toolHandler(\"get-engineering-activity\", args),\n );\n\n server.tool(\n \"list_engineering_sessions\",\n \"List agent sessions (Claude Code, Codex, Gemini CLI, Mastra). Each session includes first prompt preview and event counts.\",\n {\n scope: z\n .enum([\"org\", \"project\"])\n .optional()\n .describe(\"Query scope. Default 'org'.\"),\n target: z\n .enum([\"claude\", \"codex\", \"gemini\", \"mastra\"])\n .optional()\n .describe(\"Filter by agent type. Omit for all.\"),\n githubUsername: z\n .string()\n .optional()\n .describe(\"Filter to sessions by this GitHub username.\"),\n timeRange: z.enum([\"1h\", \"6h\", \"24h\", \"7d\", \"30d\"]).optional(),\n since: z.string().optional().describe(\"ISO 8601 start timestamp.\"),\n until: z.string().optional().describe(\"ISO 8601 end timestamp.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Max sessions to return (default 20, max 50).\"),\n },\n async (args) => toolHandler(\"list-engineering-sessions\", args),\n );\n\n server.tool(\n \"get_session_timeline\",\n 'Get chronological timeline for a coding agent session. Returns messages and/or hook events interleaved by timestamp. Use source=\"hooks\" to see permission requests, tool approvals, etc. REQUIRES: sessionId from list_engineering_sessions.',\n {\n sessionId: z.string().describe(\"The session ID to get details for.\"),\n includeSystemMessages: z\n .boolean()\n .optional()\n .describe(\"Include system messages (default false).\"),\n source: z\n .enum([\"messages\", \"hooks\", \"all\"])\n .optional()\n .describe(\n 'Filter by source: \"messages\" (scanner messages only), \"hooks\" (hook events only), \"all\" (both interleaved). Default \"all\".',\n ),\n eventType: z\n .string()\n .optional()\n .describe(\n 'Filter hook events by type (e.g. \"PermissionRequest\", \"PreToolUse\", \"Stop\"). Only applies when source includes hooks.',\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Max entries to return (default 50, max 200).\"),\n offset: z\n .number()\n .optional()\n .describe(\"Skip first N entries for pagination.\"),\n },\n async (args) => toolHandler(\"get-session-timeline\", args),\n );\n\n server.tool(\n \"get_session_turns\",\n \"Get per-turn token accounting for a coding agent session. USE FOR: understanding cost per turn, model used at each step, cache hit analysis. REQUIRES: sessionId from list_engineering_sessions.\",\n {\n sessionId: z.string().describe(\"The session ID to get turns for.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Max turns to return (default 50, max 200).\"),\n offset: z\n .number()\n .optional()\n .describe(\"Skip first N turns for pagination.\"),\n },\n async (args) => toolHandler(\"get-session-turns\", args),\n );\n\n server.tool(\n \"get_ai_spending\",\n \"Get AI spending and token usage data. Groups by 'session' (default), 'model', or 'day'.\",\n {\n timeRange: z\n .enum([\"1h\", \"6h\", \"24h\", \"7d\", \"30d\"])\n .optional()\n .describe(\"Default '7d'.\"),\n since: z.string().optional().describe(\"ISO 8601 start timestamp.\"),\n until: z.string().optional().describe(\"ISO 8601 end timestamp.\"),\n groupBy: z\n .enum([\"session\", \"model\", \"day\"])\n .optional()\n .describe(\"How to group results.\"),\n target: z\n .enum([\"claude\", \"codex\", \"gemini\", \"mastra\"])\n .optional()\n .describe(\"Filter by agent type. Omit for all.\"),\n },\n async (args) => toolHandler(\"get-ai-spending\", args),\n );\n\n server.tool(\n \"search_engineering_sessions\",\n \"Search across agent sessions by text. Searches prompts, tool names, and event payloads.\",\n {\n query: z.string().describe(\"Text to search for. Case-insensitive.\"),\n timeRange: z.enum([\"1h\", \"6h\", \"24h\", \"7d\", \"30d\"]).optional(),\n since: z.string().optional(),\n until: z.string().optional(),\n target: z\n .enum([\"claude\", \"codex\", \"gemini\", \"mastra\"])\n .optional()\n .describe(\"Filter by agent type. Omit for all.\"),\n limit: z.number().optional().describe(\"Max results (default 20).\"),\n },\n async (args) => toolHandler(\"search-engineering-sessions\", args),\n );\n\n // ── Config Snapshots ────────────────────────────────────────────────────\n\n server.tool(\n \"list_user_configs\",\n \"List user-level configuration snapshots (CLAUDE.md, settings, etc.) across the org. Shows who has configs and when they were last updated.\",\n {},\n async () => {\n try {\n const orgSlug = getSelectedOrg();\n if (!orgSlug) return errorResult(\"No org selected. Run `fml login`.\");\n const api = await getAuthenticatedClient();\n if (!api) return errorResult(\"Not authenticated. Run `fml login`.\");\n const result = await api.listUserConfigSnapshots(orgSlug);\n return textResult(result);\n } catch (err) {\n Sentry.captureException(err);\n return errorResult(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n );\n\n server.tool(\n \"get_user_config\",\n \"Get detailed user configuration for a specific GitHub user — their CLAUDE.md, settings.json, MCP servers, etc.\",\n {\n githubUsername: z.string().describe(\"GitHub username to look up.\"),\n },\n async (args) => {\n try {\n const orgSlug = getSelectedOrg();\n if (!orgSlug) return errorResult(\"No org selected. Run `fml login`.\");\n const api = await getAuthenticatedClient();\n if (!api) return errorResult(\"Not authenticated. Run `fml login`.\");\n const result = await api.getUserConfigDetail(\n orgSlug,\n args.githubUsername,\n );\n if (!result)\n return errorResult(`No config found for ${args.githubUsername}.`);\n return textResult(result);\n } catch (err) {\n Sentry.captureException(err);\n return errorResult(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n );\n\n server.tool(\n \"list_repo_configs\",\n \"List repository-level configuration snapshots (CLAUDE.md, .mcp.json, etc.) across the org. Optionally filter by repository.\",\n {\n repository: z\n .string()\n .optional()\n .describe(\"Filter by repository full name (e.g. 'org/repo').\"),\n },\n async (args) => {\n try {\n const orgSlug = getSelectedOrg();\n if (!orgSlug) return errorResult(\"No org selected. Run `fml login`.\");\n const api = await getAuthenticatedClient();\n if (!api) return errorResult(\"Not authenticated. Run `fml login`.\");\n const result = await api.listRepoConfigSnapshots(\n orgSlug,\n args.repository,\n );\n return textResult(result);\n } catch (err) {\n Sentry.captureException(err);\n return errorResult(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n );\n\n server.tool(\n \"get_repo_config\",\n \"Get detailed repository configuration — CLAUDE.md files, .mcp.json, and other agent config found in a specific repo.\",\n {\n repository: z\n .string()\n .describe(\"Repository full name (e.g. 'org/repo').\"),\n },\n async (args) => {\n try {\n const orgSlug = getSelectedOrg();\n if (!orgSlug) return errorResult(\"No org selected. Run `fml login`.\");\n const api = await getAuthenticatedClient();\n if (!api) return errorResult(\"Not authenticated. Run `fml login`.\");\n const result = await api.getRepoConfigDetail(orgSlug, args.repository);\n if (!result)\n return errorResult(`No config found for ${args.repository}.`);\n return textResult(result);\n } catch (err) {\n Sentry.captureException(err);\n return errorResult(\n `Error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n },\n );\n}\n"],"mappings":"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","names":["server"]}
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
readTokens,
|
|
5
5
|
setSelectedOrg,
|
|
6
6
|
writeTokens
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-CUBBYHH7.js";
|
|
8
8
|
import "./chunk-4YEAQJPF.js";
|
|
9
9
|
import "./chunk-PZ5AY32C.js";
|
|
10
10
|
export {
|
|
@@ -14,4 +14,4 @@ export {
|
|
|
14
14
|
setSelectedOrg,
|
|
15
15
|
writeTokens
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=token-store-
|
|
17
|
+
//# sourceMappingURL=token-store-HOFFHNNN.js.map
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fml-inc/fml",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "FML agent tools for Claude Code",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"packageManager": "pnpm@10.17.1",
|
|
8
8
|
"engines": {
|
|
9
|
-
"node": ">=
|
|
9
|
+
"node": ">=24.0.0"
|
|
10
10
|
},
|
|
11
11
|
"bin": {
|
|
12
12
|
"fml": "./bin/fml"
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"test:watch": "vitest"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
+
"@fml-inc/panopticon": "^0.2.10",
|
|
38
39
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
39
40
|
"better-sqlite3": "^11.0.0",
|
|
40
41
|
"commander": "^13.1.0",
|
|
@@ -54,10 +55,9 @@
|
|
|
54
55
|
]
|
|
55
56
|
},
|
|
56
57
|
"devDependencies": {
|
|
57
|
-
"@fml-inc/panopticon": "^0.2.2",
|
|
58
58
|
"@sentry/core": "^10.43.0",
|
|
59
59
|
"@types/better-sqlite3": "^7.6.0",
|
|
60
|
-
"@types/node": "^
|
|
60
|
+
"@types/node": "^24.0.0",
|
|
61
61
|
"tsup": "^8.0.0",
|
|
62
62
|
"typescript": "^5",
|
|
63
63
|
"vitest": "^4.1.0"
|
package/dist/chunk-2CRFCFE4.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
// node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/dist/chunk-PZ5AY32C.js
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __export = (target, all) => {
|
|
4
|
-
for (var name in all)
|
|
5
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export {
|
|
9
|
-
__export
|
|
10
|
-
};
|
|
11
|
-
//# sourceMappingURL=chunk-2CRFCFE4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/.pnpm/@fml-inc+panopticon@0.2.2/node_modules/@fml-inc/panopticon/dist/chunk-PZ5AY32C.js"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\n\nexport {\n __export\n};\n//# sourceMappingURL=chunk-PZ5AY32C.js.map"],"mappings":";AAAA,IAAI,YAAY,OAAO;AACvB,IAAI,WAAW,CAAC,QAAQ,QAAQ;AAC9B,WAAS,QAAQ;AACf,cAAU,QAAQ,MAAM,EAAE,KAAK,IAAI,IAAI,GAAG,YAAY,KAAK,CAAC;AAChE;","names":[]}
|