riveter-mcp-server 0.2.5 → 0.3.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/README.md CHANGED
@@ -4,13 +4,42 @@ An [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that c
4
4
 
5
5
  Tools are generated dynamically from Riveter's [OpenAPI spec](https://docs.riveterhq.com/openapi.yaml), so they stay up to date automatically.
6
6
 
7
+ Two ways to connect:
8
+
9
+ - **Hosted** — `https://mcp.riveterhq.com/mcp`. Nothing to install. Works from claude.ai, Claude Desktop, Cowork, Claude mobile, ChatGPT, Claude Code, and Cursor.
10
+ - **Local (`npx`)** — this npm package, run on your machine over stdio. Use it when your client cannot reach remote servers.
11
+
7
12
  ## Setup
8
13
 
9
- ### 1. Get a Riveter API key
14
+ ### 1a. Hosted server (no API key needed up front)
10
15
 
11
- Go to [app.riveterhq.com/settings/api](https://app.riveterhq.com/settings/api) and create an API key.
16
+ Add `https://mcp.riveterhq.com/mcp` as a custom connector and click Connect. A browser window opens on Riveter: sign in and click **Allow**. Riveter creates an API key for that connection; it is listed in [Settings → API keys](https://app.riveterhq.com/settings/api), and revoking it disconnects the client.
17
+
18
+ **Claude Code:**
19
+
20
+ ```bash
21
+ claude mcp add --transport http riveter https://mcp.riveterhq.com/mcp
22
+ ```
12
23
 
13
- ### 2. Configure your client
24
+ Then run `/mcp` and choose Authenticate.
25
+
26
+ **Cursor:**
27
+
28
+ ```json
29
+ {
30
+ "mcpServers": {
31
+ "riveter": {
32
+ "url": "https://mcp.riveterhq.com/mcp"
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ If the client cannot open a browser, pass a key as a header instead: `Authorization: Bearer sk_riv_your_key_here` (Claude Code `--header "Authorization: Bearer sk_riv_..."`, Cursor `"headers": { "Authorization": "Bearer sk_riv_..." }`).
39
+
40
+ ### 1b. Local server (npx)
41
+
42
+ Get a Riveter API key at [app.riveterhq.com/settings/api](https://app.riveterhq.com/settings/api).
14
43
 
15
44
  **Claude Desktop** — open the config file:
16
45
 
@@ -49,21 +78,35 @@ codex mcp add riveter --env RIVETER_API_KEY=sk_riv_your_key_here -- npx -y rivet
49
78
 
50
79
  ## Environment variables
51
80
 
81
+ Local (stdio) server — `dist/index.js`:
82
+
52
83
  | Variable | Required | Default | Description |
53
84
  | ---------------------- | -------- | ----------------------------------------- | -------------------- |
54
85
  | `RIVETER_API_KEY` | Yes | — | Your Riveter API key |
55
86
  | `RIVETER_API_BASE_URL` | No | `https://api.riveterhq.com/v1` | API base URL |
56
87
  | `RIVETER_OPENAPI_URL` | No | `https://docs.riveterhq.com/openapi.yaml` | OpenAPI spec URL |
57
88
 
89
+ Hosted (Streamable HTTP) server — `dist/http.js`, deployed by Riveter:
90
+
91
+ | Variable | Default | Description |
92
+ | -------------------------- | ---------------------------------- | -------------------------------------------------------------------- |
93
+ | `PORT` | `8080` | Listen port |
94
+ | `MCP_PUBLIC_URL` | `https://mcp.riveterhq.com/mcp` | Public URL, exactly as users enter it (RFC 9728 `resource`) |
95
+ | `OAUTH_ISSUER_URL` | `https://app.riveterhq.com` | Authorization server advertised in the protected resource metadata |
96
+ | `SPEC_REFRESH_INTERVAL_MS` | `600000` | How often the spec is re-fetched; `0` disables |
97
+ | `RIVETER_API_BASE_URL`, `RIVETER_OPENAPI_URL` | as above | |
98
+
99
+ The hosted server holds no API key. It forwards the caller's `Authorization: Bearer ...` header to the API on every call and answers `401` with a `WWW-Authenticate` challenge when the header is missing.
100
+
58
101
  ## How it works
59
102
 
60
103
  On startup, the server:
61
104
 
62
105
  1. Fetches the OpenAPI spec from `docs.riveterhq.com/openapi.yaml`
63
- 2. Parses each endpoint into an MCP tool with typed parameters
64
- 3. Serves the tools over stdio for your assistant to use
106
+ 2. Parses each endpoint into an MCP tool with typed parameters and annotations (`readOnlyHint` from `GET`, `destructiveHint` from `DELETE` or the spec's `x-mcp-destructive`)
107
+ 3. Serves the tools over stdio (local) or Streamable HTTP (hosted)
65
108
 
66
- When the API docs are updated, the MCP server picks up the changes the next time your assistant launches — no rebuild or republish needed.
109
+ When the API docs are updated, the local server picks up the changes the next time your assistant launches, and the hosted server re-fetches the spec every 10 minutes — no rebuild or republish needed.
67
110
 
68
111
  ## Development
69
112
 
@@ -73,7 +116,9 @@ This package lives in the `riveter` monorepo under `mcp-server/`. From the repo
73
116
  pnpm --filter riveter-mcp-server test # build + unit + e2e + spec-contract tests
74
117
  ```
75
118
 
76
- The spec-contract tests parse the repo's real `public/api_docs/openapi.yaml` (and the legacy spec), so a spec change that would break tool generation fails CI. To publish: bump the version in `package.json`, `server.json`, and `src/index.ts`, then run `pnpm publish` from `mcp-server/`.
119
+ The spec-contract tests parse the repo's real `public/api_docs/openapi.yaml` (and the legacy spec), so a spec change that would break tool generation fails CI. To publish: bump the version in `package.json`, `server.json`, and `src/server.ts`, then run `pnpm publish` from `mcp-server/`.
120
+
121
+ Run the hosted server locally with `pnpm dev:http` (defaults to port 8080; set `MCP_PUBLIC_URL=http://localhost:8080/mcp`). The hosted service is deployed from `Dockerfile` by Render (`mcp-server` in the root `render.yaml`).
77
122
 
78
123
  ## Support
79
124
 
package/dist/http.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/http.js ADDED
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env node
2
+ // Hosted entrypoint (mcp.riveterhq.com). Same tools as the stdio server, served
3
+ // over Streamable HTTP so cloud MCP clients (claude.ai, Cowork, ChatGPT) can
4
+ // reach it. Stateless: every request builds a throwaway McpServer bound to the
5
+ // caller's bearer token, which is forwarded verbatim to the Riveter API.
6
+ import { createServer } from "node:http";
7
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
8
+ import { buildMcpServer, fetchAndParseSpec, DEFAULT_API_BASE_URL, DEFAULT_OPENAPI_SPEC_URL, SERVER_VERSION, } from "./server.js";
9
+ const PORT = Number(process.env.PORT || 8080);
10
+ const OPENAPI_SPEC_URL = process.env.RIVETER_OPENAPI_URL || DEFAULT_OPENAPI_SPEC_URL;
11
+ const API_BASE_URL = process.env.RIVETER_API_BASE_URL || DEFAULT_API_BASE_URL;
12
+ // Must match the URL users paste into their MCP client exactly (RFC 9728
13
+ // `resource`), path included.
14
+ const MCP_PUBLIC_URL = process.env.MCP_PUBLIC_URL || "https://mcp.riveterhq.com/mcp";
15
+ const OAUTH_ISSUER_URL = process.env.OAUTH_ISSUER_URL || "https://app.riveterhq.com";
16
+ // The stdio server re-reads the spec on every client restart; the hosted one
17
+ // runs for weeks, so it re-fetches on a timer to keep the "spec change = tool
18
+ // change, no redeploy" property.
19
+ const SPEC_REFRESH_INTERVAL_MS = Number(process.env.SPEC_REFRESH_INTERVAL_MS || 10 * 60 * 1000);
20
+ const mcpPublicUrl = new URL(MCP_PUBLIC_URL);
21
+ const MCP_PATH = mcpPublicUrl.pathname;
22
+ const PROTECTED_RESOURCE_METADATA_PATH = "/.well-known/oauth-protected-resource";
23
+ const PROTECTED_RESOURCE_METADATA_URL = `${mcpPublicUrl.origin}${PROTECTED_RESOURCE_METADATA_PATH}${MCP_PATH}`;
24
+ let parsedSpec;
25
+ function sendJson(res, status, body, headers = {}) {
26
+ res.writeHead(status, { "Content-Type": "application/json", ...headers });
27
+ res.end(JSON.stringify(body));
28
+ }
29
+ function protectedResourceMetadata() {
30
+ return {
31
+ resource: MCP_PUBLIC_URL,
32
+ authorization_servers: [OAUTH_ISSUER_URL],
33
+ bearer_methods_supported: ["header"],
34
+ scopes_supported: ["api"],
35
+ resource_name: "Riveter",
36
+ resource_documentation: "https://docs.riveterhq.com",
37
+ };
38
+ }
39
+ function extractBearerToken(req) {
40
+ const header = req.headers.authorization;
41
+ if (!header)
42
+ return null;
43
+ const match = header.match(/^Bearer\s+(.+)$/i);
44
+ return match ? match[1].trim() : null;
45
+ }
46
+ function respondUnauthorized(res) {
47
+ sendJson(res, 401, {
48
+ error: "unauthorized",
49
+ error_description: "Provide a Riveter API key as `Authorization: Bearer sk_riv_...` or connect through OAuth.",
50
+ }, { "WWW-Authenticate": `Bearer resource_metadata="${PROTECTED_RESOURCE_METADATA_URL}", scope="api"` });
51
+ }
52
+ // Browsers send Origin; MCP clients (Anthropic, OpenAI) do not. Rejecting a
53
+ // foreign Origin blocks DNS-rebinding style calls from a web page.
54
+ function originAllowed(req) {
55
+ const origin = req.headers.origin;
56
+ if (!origin)
57
+ return true;
58
+ try {
59
+ return new URL(origin).host === mcpPublicUrl.host;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ async function handleMcpRequest(req, res) {
66
+ if (!originAllowed(req)) {
67
+ sendJson(res, 403, { error: "forbidden", error_description: "Origin not allowed" });
68
+ return;
69
+ }
70
+ const bearerToken = extractBearerToken(req);
71
+ if (!bearerToken) {
72
+ respondUnauthorized(res);
73
+ return;
74
+ }
75
+ const server = buildMcpServer({ parsedSpec, apiBaseUrl: API_BASE_URL, bearerToken });
76
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
77
+ res.on("close", () => {
78
+ void transport.close();
79
+ void server.close();
80
+ });
81
+ await server.connect(transport);
82
+ await transport.handleRequest(req, res);
83
+ }
84
+ function isProtectedResourceMetadataPath(pathname) {
85
+ return (pathname === PROTECTED_RESOURCE_METADATA_PATH ||
86
+ pathname === `${PROTECTED_RESOURCE_METADATA_PATH}/` ||
87
+ pathname === `${PROTECTED_RESOURCE_METADATA_PATH}${MCP_PATH}`);
88
+ }
89
+ async function route(req, res) {
90
+ const pathname = new URL(req.url || "/", mcpPublicUrl.origin).pathname;
91
+ if (pathname === "/healthz") {
92
+ sendJson(res, 200, { status: "ok", version: SERVER_VERSION, tools: parsedSpec.operations.length });
93
+ return;
94
+ }
95
+ if (isProtectedResourceMetadataPath(pathname)) {
96
+ sendJson(res, 200, protectedResourceMetadata());
97
+ return;
98
+ }
99
+ if (pathname === MCP_PATH) {
100
+ await handleMcpRequest(req, res);
101
+ return;
102
+ }
103
+ sendJson(res, 404, { error: "not_found" });
104
+ }
105
+ async function refreshSpec() {
106
+ try {
107
+ parsedSpec = await fetchAndParseSpec(OPENAPI_SPEC_URL);
108
+ console.error(`riveter-mcp-server: loaded ${parsedSpec.operations.length} tools from ${OPENAPI_SPEC_URL}`);
109
+ }
110
+ catch (err) {
111
+ console.error(`riveter-mcp-server: spec refresh failed, keeping previous spec: ${err}`);
112
+ }
113
+ }
114
+ async function main() {
115
+ try {
116
+ parsedSpec = await fetchAndParseSpec(OPENAPI_SPEC_URL);
117
+ }
118
+ catch (err) {
119
+ console.error(`Failed to fetch OpenAPI spec: ${err}`);
120
+ process.exit(1);
121
+ }
122
+ console.error(`riveter-mcp-server: loaded ${parsedSpec.operations.length} tools from ${OPENAPI_SPEC_URL}`);
123
+ if (SPEC_REFRESH_INTERVAL_MS > 0) {
124
+ setInterval(() => void refreshSpec(), SPEC_REFRESH_INTERVAL_MS).unref();
125
+ }
126
+ const httpServer = createServer((req, res) => {
127
+ route(req, res).catch((err) => {
128
+ console.error("riveter-mcp-server: request failed:", err);
129
+ if (!res.headersSent) {
130
+ sendJson(res, 500, { error: "internal_error" });
131
+ }
132
+ else {
133
+ res.end();
134
+ }
135
+ });
136
+ });
137
+ const shutdown = () => {
138
+ httpServer.close(() => process.exit(0));
139
+ setTimeout(() => process.exit(0), 10_000).unref();
140
+ };
141
+ process.on("SIGTERM", shutdown);
142
+ process.on("SIGINT", shutdown);
143
+ httpServer.listen(PORT, () => {
144
+ console.error(`riveter-mcp-server v${SERVER_VERSION} listening on :${PORT} (public URL ${MCP_PUBLIC_URL})`);
145
+ });
146
+ }
147
+ main().catch((err) => {
148
+ console.error("Fatal error:", err);
149
+ process.exit(1);
150
+ });
151
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,319 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
- import { z } from "zod";
5
- import { parseOpenApiSpec } from "./openapi-parser.js";
6
- const OPENAPI_SPEC_URL = process.env.RIVETER_OPENAPI_URL || "https://docs.riveterhq.com/openapi.yaml";
7
- const API_BASE_URL = process.env.RIVETER_API_BASE_URL || "https://api.riveterhq.com/v1";
3
+ import { buildMcpServer, fetchAndParseSpec, DEFAULT_API_BASE_URL, DEFAULT_OPENAPI_SPEC_URL, } from "./server.js";
4
+ const OPENAPI_SPEC_URL = process.env.RIVETER_OPENAPI_URL || DEFAULT_OPENAPI_SPEC_URL;
5
+ const API_BASE_URL = process.env.RIVETER_API_BASE_URL || DEFAULT_API_BASE_URL;
8
6
  const API_KEY = process.env.RIVETER_API_KEY || "";
9
- // Flat client-side ceiling for a single API call. Kept well above the server's
10
- // max long-poll budget (GET /runs/{id}/result?wait=N) so a long-poll never
11
- // races this timeout — it only trips on a genuinely stalled connection.
12
- const REQUEST_TIMEOUT_MS = 120_000;
13
- async function fetchSpec() {
14
- const res = await fetch(OPENAPI_SPEC_URL);
15
- if (!res.ok) {
16
- throw new Error(`Failed to fetch OpenAPI spec from ${OPENAPI_SPEC_URL}: ${res.status}`);
17
- }
18
- return res.text();
19
- }
20
- async function callApi(method, path, queryParams, body, headerParams) {
21
- const url = new URL(`${API_BASE_URL}${path}`);
22
- if (queryParams) {
23
- for (const [key, value] of Object.entries(queryParams)) {
24
- if (value !== undefined && value !== "") {
25
- url.searchParams.set(key, value);
26
- }
27
- }
28
- }
29
- const headers = {
30
- Authorization: `Bearer ${API_KEY}`,
31
- "Content-Type": "application/json",
32
- Accept: "application/json",
33
- ...headerParams,
34
- };
35
- const fetchOptions = { method: method.toUpperCase(), headers };
36
- if (body && (method === "post" || method === "put" || method === "patch")) {
37
- fetchOptions.body = JSON.stringify(body);
38
- }
39
- const controller = new AbortController();
40
- const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
41
- try {
42
- const res = await fetch(url.toString(), {
43
- ...fetchOptions,
44
- signal: controller.signal,
45
- });
46
- const text = await res.text();
47
- let data;
48
- try {
49
- data = JSON.parse(text);
50
- }
51
- catch {
52
- data = { raw_response: text, status_code: res.status };
53
- }
54
- if (!res.ok) {
55
- return {
56
- error: true,
57
- status_code: res.status,
58
- ...(typeof data === "object" && data !== null ? data : { message: text }),
59
- };
60
- }
61
- return data;
62
- }
63
- catch (err) {
64
- if (controller.signal.aborted) {
65
- return {
66
- error: true,
67
- status_code: 0,
68
- message: `Request to ${path} timed out after ${REQUEST_TIMEOUT_MS / 1000}s`,
69
- };
70
- }
71
- throw err;
72
- }
73
- finally {
74
- clearTimeout(timeout);
75
- }
76
- }
77
- // Workflow hints appended to tool descriptions so Claude knows the async patterns.
78
- // Keyed by operationId. Covers the current spec (docs.riveterhq.com/openapi.yaml)
79
- // plus legacy-only operationIds (openapi.legacy.yaml via RIVETER_OPENAPI_URL).
80
- const WORKFLOW_HINTS = {
81
- // Current API — every kickoff returns a run; poll get_run, fetch get_run_result
82
- enrich: "\n\n**Workflow:** Starts an async run. Poll `get_run` with the returned run id until status is 'success', then call `get_run_result` for the output.",
83
- getRun: "\n\n**Workflow:** Poll this endpoint until `status` is 'success' or 'stopped'. Typical runs take 10-120 seconds. Poll every 5-10 seconds.",
84
- getRunResult: "\n\n**Workflow:** `output` is null until the run finishes. Pass `wait` (seconds, see the parameter's max) to long-poll instead of sleeping between calls.",
85
- stopRun: "\n\n**Workflow:** Stops a running run. The run cannot be resumed after stopping.",
86
- buildDataset: "\n\n**Workflow:** Starts an async dataset build run. Poll `get_run` until status is 'success', then fetch the rows with `get_run_result`. Pass `auto_run_enrichment: true` to enrich the rows in the same flow.",
87
- buildDatasetForEnrichment: "\n\n**Workflow:** Starts an async dataset build run matching the enrichment's input columns. Poll `get_run`, then fetch rows with `get_run_result`.",
88
- extendDataset: "\n\n**Workflow:** Starts an async run that adds rows to an existing dataset. Poll `get_run`, then fetch with `get_run_result`.",
89
- buildConfiguredDataset: "\n\n**Workflow:** Starts an async run of a configured dataset. Poll `get_run`, then fetch with `get_run_result`.",
90
- runExtraction: "\n\n**Workflow:** Starts an async extraction run. Poll `get_run`, then fetch the records with `get_run_result`.",
91
- createExtraction: "\n\n**Workflow:** Discovery is async but returns no run — poll `get_extraction` until `status` is 'ready', then execute with `run_extraction`.",
92
- createMonitor: "\n\n**Workflow:** Creates a scheduled monitor. Check it with `get_monitor`, pause it with `update_monitor` (enabled: false), and list its runs with `list_monitor_runs`.",
93
- // Legacy API (openapi.legacy.yaml)
94
- runNewEnrichment: "\n\n**Workflow:** This starts an async run. Use the returned `run_key` with `get_run_status` to poll until status is 'success', then `get_run_data` to retrieve results.",
95
- runExistingEnrichment: "\n\n**Workflow:** This starts an async run. Use the returned `run_key` with `get_run_status` to poll until status is 'success', then `get_run_data` to retrieve results.",
96
- getRunStatus: "\n\n**Workflow:** Poll this endpoint until `status` is 'success' or 'stopped'. Typical runs take 10-120 seconds. Poll every 5-10 seconds.",
97
- getRunData: "\n\n**Workflow:** Call this after `get_run_status` shows 'success' to get the full results.",
98
- monitorEnrichment: "\n\n**Workflow:** Creates a scheduled monitor. Use the returned `monitor_uuid` with `get_monitor_status` to check on it, or `pause_monitor` to pause it.",
99
- getMonitorStatus: "\n\n**Workflow:** Returns the monitor's schedule, enabled state, and next run time.",
100
- getMonitorRecentRunData: "\n\n**Workflow:** Returns the results from the monitor's most recent run.",
101
- getDatasetBuildStatus: "\n\n**Workflow:** Poll this endpoint until `state` is 'completed' or 'failed'. Then use `get_dataset_build_data` to get the generated rows.",
102
- getDatasetBuildData: "\n\n**Workflow:** Call this after `get_dataset_build_status` shows state 'completed' to get the generated rows.",
103
- stopDatasetBuild: "\n\n**Workflow:** Stops a dataset build in progress.",
104
- createEnrichmentFromDataset: "\n\n**Workflow:** Creates an enrichment from a completed dataset build. Then use `run_enrichment_from_dataset` with the same `run_key` to execute it.",
105
- runEnrichmentFromDataset: "\n\n**Workflow:** Starts an async enrichment run using the dataset as input. Use the returned `run_key` with `get_run_status` to poll until status is 'success', then `get_run_data` to retrieve results.",
106
- };
107
- function operationIdToToolName(operationId) {
108
- return operationId
109
- .replace(/([a-z])([A-Z])/g, "$1_$2")
110
- .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
111
- .toLowerCase();
112
- }
113
- function buildZodShape(params, bodyProps) {
114
- const shape = {};
115
- for (const param of params) {
116
- let fieldSchema;
117
- if (param.schema.enum && param.schema.enum.length > 0) {
118
- fieldSchema = z
119
- .enum(param.schema.enum)
120
- .describe(param.description || param.name);
121
- }
122
- else {
123
- switch (param.schema.type) {
124
- case "integer":
125
- fieldSchema = z
126
- .number()
127
- .int()
128
- .describe(param.description || param.name);
129
- break;
130
- case "boolean":
131
- fieldSchema = z.boolean().describe(param.description || param.name);
132
- break;
133
- default:
134
- fieldSchema = z.string().describe(param.description || param.name);
135
- }
136
- }
137
- if (!param.required) {
138
- fieldSchema = fieldSchema.optional();
139
- }
140
- shape[param.name] = fieldSchema;
141
- }
142
- for (const [name, prop] of Object.entries(bodyProps)) {
143
- if (shape[name])
144
- continue;
145
- let fieldSchema;
146
- if (prop.enum && prop.enum.length > 0) {
147
- fieldSchema = z
148
- .enum(prop.enum)
149
- .describe(prop.description || name);
150
- }
151
- else {
152
- switch (prop.type) {
153
- case "integer":
154
- fieldSchema = z
155
- .number()
156
- .int()
157
- .describe(prop.description || name);
158
- break;
159
- case "number":
160
- fieldSchema = z.number().describe(prop.description || name);
161
- break;
162
- case "boolean":
163
- fieldSchema = z.boolean().describe(prop.description || name);
164
- break;
165
- case "array": {
166
- const itemType = prop.items?.type;
167
- let inner;
168
- if (itemType === "object" && prop.items?.objectProperties) {
169
- const itemShape = {};
170
- for (const [itemPropName, itemProp] of Object.entries(prop.items.objectProperties)) {
171
- let itemField;
172
- if (itemProp.enum && itemProp.enum.length > 0) {
173
- itemField = z.enum(itemProp.enum);
174
- }
175
- else {
176
- switch (itemProp.type) {
177
- case "integer":
178
- itemField = z.number().int();
179
- break;
180
- case "number":
181
- itemField = z.number();
182
- break;
183
- case "boolean":
184
- itemField = z.boolean();
185
- break;
186
- default:
187
- itemField = z.string();
188
- }
189
- }
190
- itemField = itemField.describe(itemProp.description || itemPropName);
191
- itemShape[itemPropName] = itemProp.required ? itemField : itemField.optional();
192
- }
193
- inner = z.object(itemShape);
194
- }
195
- else {
196
- inner =
197
- itemType === "string"
198
- ? z.string()
199
- : itemType === "integer"
200
- ? z.number().int()
201
- : itemType === "number"
202
- ? z.number()
203
- : z.any();
204
- }
205
- fieldSchema = z.array(inner).describe(prop.description || name);
206
- break;
207
- }
208
- case "object":
209
- fieldSchema = z
210
- .record(z.string(), z.any())
211
- .describe(prop.description || name);
212
- break;
213
- default:
214
- fieldSchema = z.string().describe(prop.description || name);
215
- }
216
- }
217
- if (!prop.required) {
218
- fieldSchema = fieldSchema.optional();
219
- }
220
- shape[name] = fieldSchema;
221
- }
222
- return shape;
223
- }
224
7
  async function main() {
225
8
  if (!API_KEY) {
226
9
  console.error("RIVETER_API_KEY environment variable is required. Get one at https://app.riveterhq.com/settings/api");
227
10
  process.exit(1);
228
11
  }
229
- let specText;
12
+ let parsedSpec;
230
13
  try {
231
- specText = await fetchSpec();
14
+ parsedSpec = await fetchAndParseSpec(OPENAPI_SPEC_URL);
232
15
  }
233
16
  catch (err) {
234
17
  console.error(`Failed to fetch OpenAPI spec: ${err}`);
235
18
  process.exit(1);
236
19
  }
237
- const { operations, apiOverview } = parseOpenApiSpec(specText);
238
- const server = new McpServer({
239
- name: "riveter",
240
- version: "0.2.5",
241
- }, {
242
- instructions: apiOverview +
243
- "\n\nNote: Authentication is handled automatically by this MCP server. You do not need to manage API keys or headers.",
244
- });
245
- for (const op of operations) {
246
- const toolName = operationIdToToolName(op.operationId);
247
- const hint = WORKFLOW_HINTS[op.operationId] || "";
248
- const deprecationNotice = op.deprecated
249
- ? "[DEPRECATED] This endpoint still works but has a preferred successor — see the API overview for the replacement.\n\n"
250
- : "";
251
- const description = deprecationNotice + (op.summary ? `${op.summary}\n\n` : "") + op.description + hint;
252
- const shape = buildZodShape(op.parameters, op.requestBodyProperties);
253
- const pathParamNames = new Set(op.parameters.filter((p) => p.in === "path").map((p) => p.name));
254
- const queryParamNames = new Set(op.parameters.filter((p) => p.in === "query").map((p) => p.name));
255
- const headerParamNames = new Set(op.parameters.filter((p) => p.in === "header").map((p) => p.name));
256
- const method = op.method;
257
- const path = op.path;
258
- server.tool(toolName, description, shape, async (args) => {
259
- let resolvedPath = path;
260
- const queryParams = {};
261
- const bodyParams = {};
262
- const headerParams = {};
263
- for (const [key, value] of Object.entries(args)) {
264
- if (value === undefined)
265
- continue;
266
- if (pathParamNames.has(key)) {
267
- resolvedPath = resolvedPath.replaceAll(`{${key}}`, encodeURIComponent(String(value)));
268
- }
269
- else if (queryParamNames.has(key)) {
270
- queryParams[key] = String(value);
271
- }
272
- else if (headerParamNames.has(key)) {
273
- headerParams[key] = String(value);
274
- }
275
- else {
276
- bodyParams[key] = value;
277
- }
278
- }
279
- const unresolvedPlaceholder = resolvedPath.match(/\{[^}]+\}/);
280
- if (unresolvedPlaceholder) {
281
- return {
282
- content: [
283
- {
284
- type: "text",
285
- text: `Missing required path parameter ${unresolvedPlaceholder[0]} for ${path}`,
286
- },
287
- ],
288
- isError: true,
289
- };
290
- }
291
- try {
292
- const result = await callApi(method, resolvedPath, Object.keys(queryParams).length > 0 ? queryParams : undefined, Object.keys(bodyParams).length > 0 ? bodyParams : undefined, Object.keys(headerParams).length > 0 ? headerParams : undefined);
293
- return {
294
- content: [
295
- {
296
- type: "text",
297
- text: JSON.stringify(result, null, 2),
298
- },
299
- ],
300
- };
301
- }
302
- catch (err) {
303
- return {
304
- content: [
305
- {
306
- type: "text",
307
- text: `API request failed: ${err instanceof Error ? err.message : String(err)}`,
308
- },
309
- ],
310
- isError: true,
311
- };
312
- }
313
- });
314
- }
315
- const transport = new StdioServerTransport();
316
- await server.connect(transport);
20
+ const server = buildMcpServer({ parsedSpec, apiBaseUrl: API_BASE_URL, bearerToken: API_KEY });
21
+ await server.connect(new StdioServerTransport());
317
22
  }
318
23
  main().catch((err) => {
319
24
  console.error("Fatal error:", err);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,aAAa,CAAA;AAEpB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,wBAAwB,CAAA;AACpF,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,oBAAoB,CAAA;AAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAA;AAEjD,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CACX,qGAAqG,CACtG,CAAA;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,UAAU,CAAA;IACd,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,CAAA;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAA;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;IAC7F,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAA;AAClD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -31,6 +31,7 @@ export interface OpenApiOperation {
31
31
  summary: string;
32
32
  description: string;
33
33
  deprecated: boolean;
34
+ destructive?: boolean;
34
35
  parameters: OpenApiParameter[];
35
36
  requestBodyProperties: Record<string, OpenApiBodyProperty>;
36
37
  }
@@ -173,6 +173,9 @@ export function parseOpenApiSpec(specText) {
173
173
  summary: operation.summary || "",
174
174
  description: cleanDescription(operation.description) + examplesText,
175
175
  deprecated: operation.deprecated === true,
176
+ destructive: typeof operation["x-mcp-destructive"] === "boolean"
177
+ ? operation["x-mcp-destructive"]
178
+ : undefined,
176
179
  parameters,
177
180
  requestBodyProperties,
178
181
  });
@@ -1 +1 @@
1
- {"version":3,"file":"openapi-parser.js","sourceRoot":"","sources":["../src/openapi-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openapi-parser.js","sourceRoot":"","sources":["../src/openapi-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
3
+ import { type OpenApiOperation, type ParseResult } from "./openapi-parser.js";
4
+ export declare const SERVER_VERSION = "0.3.0";
5
+ export declare const DEFAULT_OPENAPI_SPEC_URL = "https://docs.riveterhq.com/openapi.yaml";
6
+ export declare const DEFAULT_API_BASE_URL = "https://api.riveterhq.com/v1";
7
+ export declare function fetchAndParseSpec(specUrl: string): Promise<ParseResult>;
8
+ export declare function operationIdToToolName(operationId: string): string;
9
+ export declare function toolAnnotationsFor(op: OpenApiOperation): ToolAnnotations;
10
+ export interface RiveterMcpServerConfig {
11
+ parsedSpec: ParseResult;
12
+ apiBaseUrl: string;
13
+ bearerToken: string;
14
+ }
15
+ export declare function buildMcpServer(config: RiveterMcpServerConfig): McpServer;
package/dist/server.js ADDED
@@ -0,0 +1,253 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { parseOpenApiSpec, } from "./openapi-parser.js";
4
+ export const SERVER_VERSION = "0.3.0";
5
+ export const DEFAULT_OPENAPI_SPEC_URL = "https://docs.riveterhq.com/openapi.yaml";
6
+ export const DEFAULT_API_BASE_URL = "https://api.riveterhq.com/v1";
7
+ // Flat client-side ceiling for a single API call. Kept well above the server's
8
+ // max long-poll budget (GET /runs/{id}/result?wait=N) so a long-poll never
9
+ // races this timeout — it only trips on a genuinely stalled connection.
10
+ const REQUEST_TIMEOUT_MS = 120_000;
11
+ export async function fetchAndParseSpec(specUrl) {
12
+ const res = await fetch(specUrl);
13
+ if (!res.ok) {
14
+ throw new Error(`Failed to fetch OpenAPI spec from ${specUrl}: ${res.status}`);
15
+ }
16
+ return parseOpenApiSpec(await res.text());
17
+ }
18
+ async function callApi(apiBaseUrl, bearerToken, method, path, queryParams, body, headerParams) {
19
+ const url = new URL(`${apiBaseUrl}${path}`);
20
+ if (queryParams) {
21
+ for (const [key, value] of Object.entries(queryParams)) {
22
+ if (value !== undefined && value !== "") {
23
+ url.searchParams.set(key, value);
24
+ }
25
+ }
26
+ }
27
+ const headers = {
28
+ Authorization: `Bearer ${bearerToken}`,
29
+ "Content-Type": "application/json",
30
+ Accept: "application/json",
31
+ ...headerParams,
32
+ };
33
+ const fetchOptions = { method: method.toUpperCase(), headers };
34
+ if (body && (method === "post" || method === "put" || method === "patch")) {
35
+ fetchOptions.body = JSON.stringify(body);
36
+ }
37
+ const controller = new AbortController();
38
+ const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
39
+ try {
40
+ const res = await fetch(url.toString(), {
41
+ ...fetchOptions,
42
+ signal: controller.signal,
43
+ });
44
+ const text = await res.text();
45
+ let data;
46
+ try {
47
+ data = JSON.parse(text);
48
+ }
49
+ catch {
50
+ data = { raw_response: text, status_code: res.status };
51
+ }
52
+ if (!res.ok) {
53
+ return {
54
+ error: true,
55
+ status_code: res.status,
56
+ ...(typeof data === "object" && data !== null ? data : { message: text }),
57
+ };
58
+ }
59
+ return data;
60
+ }
61
+ catch (err) {
62
+ if (controller.signal.aborted) {
63
+ return {
64
+ error: true,
65
+ status_code: 0,
66
+ message: `Request to ${path} timed out after ${REQUEST_TIMEOUT_MS / 1000}s`,
67
+ };
68
+ }
69
+ throw err;
70
+ }
71
+ finally {
72
+ clearTimeout(timeout);
73
+ }
74
+ }
75
+ // Workflow hints appended to tool descriptions so Claude knows the async patterns.
76
+ // Keyed by operationId. Covers the current spec (docs.riveterhq.com/openapi.yaml)
77
+ // plus legacy-only operationIds (openapi.legacy.yaml via RIVETER_OPENAPI_URL).
78
+ const WORKFLOW_HINTS = {
79
+ // Current API — every kickoff returns a run; poll get_run, fetch get_run_result
80
+ enrich: "\n\n**Workflow:** Starts an async run. Poll `get_run` with the returned run id until status is 'success', then call `get_run_result` for the output.",
81
+ getRun: "\n\n**Workflow:** Poll this endpoint until `status` is 'success' or 'stopped'. Typical runs take 10-120 seconds. Poll every 5-10 seconds.",
82
+ getRunResult: "\n\n**Workflow:** `output` is null until the run finishes. Pass `wait` (seconds, see the parameter's max) to long-poll instead of sleeping between calls.",
83
+ stopRun: "\n\n**Workflow:** Stops a running run. The run cannot be resumed after stopping.",
84
+ buildDataset: "\n\n**Workflow:** Starts an async dataset build run. Poll `get_run` until status is 'success', then fetch the rows with `get_run_result`. Pass `auto_run_enrichment: true` to enrich the rows in the same flow.",
85
+ buildDatasetForEnrichment: "\n\n**Workflow:** Starts an async dataset build run matching the enrichment's input columns. Poll `get_run`, then fetch rows with `get_run_result`.",
86
+ extendDataset: "\n\n**Workflow:** Starts an async run that adds rows to an existing dataset. Poll `get_run`, then fetch with `get_run_result`.",
87
+ buildConfiguredDataset: "\n\n**Workflow:** Starts an async run of a configured dataset. Poll `get_run`, then fetch with `get_run_result`.",
88
+ runExtraction: "\n\n**Workflow:** Starts an async extraction run. Poll `get_run`, then fetch the records with `get_run_result`.",
89
+ createExtraction: "\n\n**Workflow:** Discovery is async but returns no run — poll `get_extraction` until `status` is 'ready', then execute with `run_extraction`.",
90
+ createMonitor: "\n\n**Workflow:** Creates a scheduled monitor. Check it with `get_monitor`, pause it with `update_monitor` (enabled: false), and list its runs with `list_monitor_runs`.",
91
+ // Legacy API (openapi.legacy.yaml)
92
+ runNewEnrichment: "\n\n**Workflow:** This starts an async run. Use the returned `run_key` with `get_run_status` to poll until status is 'success', then `get_run_data` to retrieve results.",
93
+ runExistingEnrichment: "\n\n**Workflow:** This starts an async run. Use the returned `run_key` with `get_run_status` to poll until status is 'success', then `get_run_data` to retrieve results.",
94
+ getRunStatus: "\n\n**Workflow:** Poll this endpoint until `status` is 'success' or 'stopped'. Typical runs take 10-120 seconds. Poll every 5-10 seconds.",
95
+ getRunData: "\n\n**Workflow:** Call this after `get_run_status` shows 'success' to get the full results.",
96
+ monitorEnrichment: "\n\n**Workflow:** Creates a scheduled monitor. Use the returned `monitor_uuid` with `get_monitor_status` to check on it, or `pause_monitor` to pause it.",
97
+ getMonitorStatus: "\n\n**Workflow:** Returns the monitor's schedule, enabled state, and next run time.",
98
+ getMonitorRecentRunData: "\n\n**Workflow:** Returns the results from the monitor's most recent run.",
99
+ getDatasetBuildStatus: "\n\n**Workflow:** Poll this endpoint until `state` is 'completed' or 'failed'. Then use `get_dataset_build_data` to get the generated rows.",
100
+ getDatasetBuildData: "\n\n**Workflow:** Call this after `get_dataset_build_status` shows state 'completed' to get the generated rows.",
101
+ stopDatasetBuild: "\n\n**Workflow:** Stops a dataset build in progress.",
102
+ createEnrichmentFromDataset: "\n\n**Workflow:** Creates an enrichment from a completed dataset build. Then use `run_enrichment_from_dataset` with the same `run_key` to execute it.",
103
+ runEnrichmentFromDataset: "\n\n**Workflow:** Starts an async enrichment run using the dataset as input. Use the returned `run_key` with `get_run_status` to poll until status is 'success', then `get_run_data` to retrieve results.",
104
+ };
105
+ export function operationIdToToolName(operationId) {
106
+ return operationId
107
+ .replace(/([a-z])([A-Z])/g, "$1_$2")
108
+ .replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2")
109
+ .toLowerCase();
110
+ }
111
+ function capitalizeFirst(text) {
112
+ return text.charAt(0).toUpperCase() + text.slice(1);
113
+ }
114
+ // Client UIs (Claude connectors, ChatGPT) read these to label tools and to
115
+ // decide when to ask the user for confirmation. Derived from the HTTP method,
116
+ // with the spec's `x-mcp-destructive` extension as the only override.
117
+ export function toolAnnotationsFor(op) {
118
+ const isReadOnly = op.method === "get";
119
+ const isDestructive = op.destructive ?? op.method === "delete";
120
+ return {
121
+ title: op.summary ? capitalizeFirst(op.summary) : undefined,
122
+ readOnlyHint: isReadOnly,
123
+ destructiveHint: isDestructive,
124
+ idempotentHint: isReadOnly || op.method === "put" || op.method === "delete",
125
+ openWorldHint: true,
126
+ };
127
+ }
128
+ function zodScalarFor(type, enumValues, description) {
129
+ if (enumValues && enumValues.length > 0) {
130
+ return z.enum(enumValues).describe(description);
131
+ }
132
+ switch (type) {
133
+ case "integer":
134
+ return z.number().int().describe(description);
135
+ case "number":
136
+ return z.number().describe(description);
137
+ case "boolean":
138
+ return z.boolean().describe(description);
139
+ default:
140
+ return z.string().describe(description);
141
+ }
142
+ }
143
+ function zodArrayItemFor(items) {
144
+ const itemType = items?.type;
145
+ if (itemType === "object" && items?.objectProperties) {
146
+ const itemShape = {};
147
+ for (const [itemPropName, itemProp] of Object.entries(items.objectProperties)) {
148
+ const itemField = zodScalarFor(itemProp.type, itemProp.enum, itemProp.description || itemPropName);
149
+ itemShape[itemPropName] = itemProp.required ? itemField : itemField.optional();
150
+ }
151
+ return z.object(itemShape);
152
+ }
153
+ switch (itemType) {
154
+ case "string":
155
+ return z.string();
156
+ case "integer":
157
+ return z.number().int();
158
+ case "number":
159
+ return z.number();
160
+ default:
161
+ return z.any();
162
+ }
163
+ }
164
+ function zodBodyPropertyFor(name, prop) {
165
+ const description = prop.description || name;
166
+ if (prop.enum && prop.enum.length > 0) {
167
+ return z.enum(prop.enum).describe(description);
168
+ }
169
+ switch (prop.type) {
170
+ case "array":
171
+ return z.array(zodArrayItemFor(prop.items)).describe(description);
172
+ case "object":
173
+ return z.record(z.string(), z.any()).describe(description);
174
+ default:
175
+ return zodScalarFor(prop.type, undefined, description);
176
+ }
177
+ }
178
+ function buildZodShape(params, bodyProps) {
179
+ const shape = {};
180
+ for (const param of params) {
181
+ const fieldSchema = zodScalarFor(param.schema.type, param.schema.enum, param.description || param.name);
182
+ shape[param.name] = param.required ? fieldSchema : fieldSchema.optional();
183
+ }
184
+ for (const [name, prop] of Object.entries(bodyProps)) {
185
+ if (shape[name])
186
+ continue;
187
+ const fieldSchema = zodBodyPropertyFor(name, prop);
188
+ shape[name] = prop.required ? fieldSchema : fieldSchema.optional();
189
+ }
190
+ return shape;
191
+ }
192
+ function textResult(text, isError = false) {
193
+ return { content: [{ type: "text", text }], ...(isError ? { isError: true } : {}) };
194
+ }
195
+ function registerOperation(server, op, config) {
196
+ const toolName = operationIdToToolName(op.operationId);
197
+ const hint = WORKFLOW_HINTS[op.operationId] || "";
198
+ const deprecationNotice = op.deprecated
199
+ ? "[DEPRECATED] This endpoint still works but has a preferred successor — see the API overview for the replacement.\n\n"
200
+ : "";
201
+ const description = deprecationNotice + (op.summary ? `${op.summary}\n\n` : "") + op.description + hint;
202
+ const shape = buildZodShape(op.parameters, op.requestBodyProperties);
203
+ const annotations = toolAnnotationsFor(op);
204
+ const pathParamNames = new Set(op.parameters.filter((p) => p.in === "path").map((p) => p.name));
205
+ const queryParamNames = new Set(op.parameters.filter((p) => p.in === "query").map((p) => p.name));
206
+ const headerParamNames = new Set(op.parameters.filter((p) => p.in === "header").map((p) => p.name));
207
+ server.registerTool(toolName, { title: annotations.title, description, inputSchema: shape, annotations }, async (args) => {
208
+ let resolvedPath = op.path;
209
+ const queryParams = {};
210
+ const bodyParams = {};
211
+ const headerParams = {};
212
+ for (const [key, value] of Object.entries(args)) {
213
+ if (value === undefined)
214
+ continue;
215
+ if (pathParamNames.has(key)) {
216
+ resolvedPath = resolvedPath.replaceAll(`{${key}}`, encodeURIComponent(String(value)));
217
+ }
218
+ else if (queryParamNames.has(key)) {
219
+ queryParams[key] = String(value);
220
+ }
221
+ else if (headerParamNames.has(key)) {
222
+ headerParams[key] = String(value);
223
+ }
224
+ else {
225
+ bodyParams[key] = value;
226
+ }
227
+ }
228
+ const unresolvedPlaceholder = resolvedPath.match(/\{[^}]+\}/);
229
+ if (unresolvedPlaceholder) {
230
+ return textResult(`Missing required path parameter ${unresolvedPlaceholder[0]} for ${op.path}`, true);
231
+ }
232
+ try {
233
+ const result = await callApi(config.apiBaseUrl, config.bearerToken, op.method, resolvedPath, Object.keys(queryParams).length > 0 ? queryParams : undefined, Object.keys(bodyParams).length > 0 ? bodyParams : undefined, Object.keys(headerParams).length > 0 ? headerParams : undefined);
234
+ return textResult(JSON.stringify(result, null, 2));
235
+ }
236
+ catch (err) {
237
+ return textResult(`API request failed: ${err instanceof Error ? err.message : String(err)}`, true);
238
+ }
239
+ });
240
+ }
241
+ // One McpServer per bearer token. Cheap to build (the spec is already parsed),
242
+ // so the HTTP entrypoint creates one per request; stdio builds one for the process.
243
+ export function buildMcpServer(config) {
244
+ const server = new McpServer({ name: "riveter", version: SERVER_VERSION }, {
245
+ instructions: config.parsedSpec.apiOverview +
246
+ "\n\nNote: Authentication is handled automatically by this MCP server. You do not need to manage API keys or headers.",
247
+ });
248
+ for (const op of config.parsedSpec.operations) {
249
+ registerOperation(server, op, config);
250
+ }
251
+ return server;
252
+ }
253
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "riveter-mcp-server",
3
- "version": "0.2.5",
3
+ "version": "0.3.0",
4
4
  "mcpName": "io.github.CodyWatters/riveter",
5
5
  "description": "MCP server for the Riveter API — connects Claude to Riveter's enrichment, scraping, and monitoring tools",
6
6
  "homepage": "https://docs.riveterhq.com",
@@ -13,14 +13,6 @@
13
13
  "bin": {
14
14
  "riveter-mcp-server": "dist/index.js"
15
15
  },
16
- "scripts": {
17
- "dev": "tsx watch src/index.ts",
18
- "build": "tsc",
19
- "start": "node dist/index.js",
20
- "typecheck": "tsc --noEmit",
21
- "test": "pnpm run build && node --test test/*.test.mjs",
22
- "prepublishOnly": "pnpm test"
23
- },
24
16
  "dependencies": {
25
17
  "@modelcontextprotocol/sdk": "^1.12.1",
26
18
  "yaml": "^2.7.1",
@@ -45,5 +37,14 @@
45
37
  "enrichment",
46
38
  "api"
47
39
  ],
48
- "license": "MIT"
49
- }
40
+ "license": "MIT",
41
+ "scripts": {
42
+ "dev": "tsx watch src/index.ts",
43
+ "build": "tsc",
44
+ "start": "node dist/index.js",
45
+ "start:http": "node dist/http.js",
46
+ "dev:http": "tsx watch src/http.ts",
47
+ "typecheck": "tsc --noEmit",
48
+ "test": "pnpm run build && node --test test/*.test.mjs"
49
+ }
50
+ }