truss-api-mcp 1.0.0 → 1.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.
Files changed (45) hide show
  1. package/.github/FUNDING.yml +1 -0
  2. package/.github/workflows/mcp-registry-publish.yml +21 -0
  3. package/.mcpize/project.json +4 -0
  4. package/README.md +59 -0
  5. package/agent-card.json +89 -0
  6. package/dist/lib/billing.d.ts +7 -0
  7. package/dist/lib/billing.d.ts.map +1 -0
  8. package/dist/lib/billing.js +31 -0
  9. package/dist/lib/billing.js.map +1 -0
  10. package/dist/tools/compare-specs.d.ts.map +1 -1
  11. package/dist/tools/compare-specs.js +2 -0
  12. package/dist/tools/compare-specs.js.map +1 -1
  13. package/dist/tools/generate-client.d.ts.map +1 -1
  14. package/dist/tools/generate-client.js +2 -0
  15. package/dist/tools/generate-client.js.map +1 -1
  16. package/dist/tools/generate-openapi.d.ts.map +1 -1
  17. package/dist/tools/generate-openapi.js +2 -0
  18. package/dist/tools/generate-openapi.js.map +1 -1
  19. package/dist/tools/generate-tests.d.ts.map +1 -1
  20. package/dist/tools/generate-tests.js +2 -0
  21. package/dist/tools/generate-tests.js.map +1 -1
  22. package/dist/tools/mock-server.d.ts.map +1 -1
  23. package/dist/tools/mock-server.js +2 -0
  24. package/dist/tools/mock-server.js.map +1 -1
  25. package/dist/tools/parse-openapi.d.ts.map +1 -1
  26. package/dist/tools/parse-openapi.js +2 -0
  27. package/dist/tools/parse-openapi.js.map +1 -1
  28. package/dist/tools/test-endpoint.d.ts.map +1 -1
  29. package/dist/tools/test-endpoint.js +2 -0
  30. package/dist/tools/test-endpoint.js.map +1 -1
  31. package/dist/tools/validate-response.d.ts.map +1 -1
  32. package/dist/tools/validate-response.js +2 -0
  33. package/dist/tools/validate-response.js.map +1 -1
  34. package/mcpize.yaml +17 -0
  35. package/package.json +16 -4
  36. package/server.json +20 -0
  37. package/src/lib/billing.ts +34 -0
  38. package/src/tools/compare-specs.ts +2 -0
  39. package/src/tools/generate-client.ts +2 -0
  40. package/src/tools/generate-openapi.ts +2 -0
  41. package/src/tools/generate-tests.ts +2 -0
  42. package/src/tools/mock-server.ts +2 -0
  43. package/src/tools/parse-openapi.ts +2 -0
  44. package/src/tools/test-endpoint.ts +2 -0
  45. package/src/tools/validate-response.ts +2 -0
@@ -0,0 +1 @@
1
+ custom: ["https://claw-factory.github.io/truss-site"]
@@ -0,0 +1,21 @@
1
+ name: Publish to MCP Registry
2
+ on:
3
+ workflow_dispatch:
4
+
5
+ permissions:
6
+ id-token: write
7
+ contents: read
8
+
9
+ jobs:
10
+ publish:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - name: Install mcp-publisher
15
+ run: npm install -g mcp-publisher
16
+ - name: Login via OIDC
17
+ run: mcp-publisher login github-oidc
18
+ - name: Validate
19
+ run: mcp-publisher validate server.json
20
+ - name: Publish
21
+ run: mcp-publisher publish server.json
@@ -0,0 +1,4 @@
1
+ {
2
+ "serverId": "a9154953-a7fd-4a4f-942e-cfd157c8398a",
3
+ "serverName": "truss-api-mcp"
4
+ }
package/README.md CHANGED
@@ -1,7 +1,50 @@
1
1
  # TRUSS API Testing MCP
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/truss-api-mcp)](https://www.npmjs.com/package/truss-api-mcp)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+
3
6
  API testing and documentation tools for Claude Code. Test endpoints, parse OpenAPI specs, validate responses, generate clients, and more — all from your AI assistant.
4
7
 
8
+ ## Quick Start
9
+
10
+ Run with npx (no install needed):
11
+
12
+ ```bash
13
+ npx -y truss-api-mcp
14
+ ```
15
+
16
+ ### Claude Desktop / Claude Code
17
+
18
+ Add to your `claude_desktop_config.json` or `.claude/settings.json`:
19
+
20
+ ```json
21
+ {
22
+ "mcpServers": {
23
+ "api-testing": {
24
+ "command": "npx",
25
+ "args": ["-y", "truss-api-mcp"]
26
+ }
27
+ }
28
+ }
29
+ ```
30
+
31
+ ### Cursor
32
+
33
+ Add to your Cursor MCP settings:
34
+
35
+ ```json
36
+ {
37
+ "mcpServers": {
38
+ "api-testing": {
39
+ "command": "npx",
40
+ "args": ["-y", "truss-api-mcp"]
41
+ }
42
+ }
43
+ }
44
+ ```
45
+
46
+ ---
47
+
5
48
  ## Tools
6
49
 
7
50
  ### Free Tier
@@ -81,3 +124,19 @@ Use compare_specs with the old and new OpenAPI specs to find breaking changes
81
124
  ## License
82
125
 
83
126
  MIT
127
+
128
+
129
+ ---
130
+
131
+ ## A2A Discovery
132
+
133
+ This server publishes a [Google A2A Protocol](https://a2a-protocol.org) Agent Card, making it discoverable by any A2A-compatible agent framework (LangGraph, CrewAI, Google ADK, AutoGen, and others).
134
+
135
+ **Agent Card:** [`agent-card.json`](./agent-card.json)
136
+
137
+ The agent card describes this server's skills, capabilities, input/output modalities, and authentication requirements in a machine-readable format. A2A clients can use it to discover and invoke tools automatically without manual configuration.
138
+
139
+ ```bash
140
+ # Fetch the agent card
141
+ curl https://raw.githubusercontent.com/claw-factory/truss-api-mcp/main/agent-card.json
142
+ ```
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "TRUSS API Testing MCP — HTTP Testing and Documentation",
3
+ "description": "API testing and documentation tools for AI agents. Test HTTP endpoints, parse OpenAPI specs, validate responses, generate API clients, create mock servers, and auto-generate documentation — all from your AI assistant.",
4
+ "version": "1.0.0",
5
+ "documentationUrl": "https://github.com/claw-factory/truss-api-mcp#readme",
6
+ "provider": {
7
+ "organization": "TRUSS / claw-factory",
8
+ "url": "https://claw-factory.github.io/truss-site"
9
+ },
10
+ "supportedInterfaces": [
11
+ {
12
+ "url": "https://claw-factory.github.io/truss-site/a2a/v1",
13
+ "protocolBinding": "HTTP+JSON",
14
+ "protocolVersion": "1.0"
15
+ }
16
+ ],
17
+ "capabilities": {
18
+ "streaming": false,
19
+ "pushNotifications": false,
20
+ "stateTransitionHistory": false,
21
+ "extendedAgentCard": false
22
+ },
23
+ "securitySchemes": {
24
+ "bearer": {
25
+ "type": "http",
26
+ "scheme": "bearer",
27
+ "description": "TRUSS license key (optional — basic HTTP testing available without authentication)"
28
+ }
29
+ },
30
+ "security": [],
31
+ "defaultInputModes": ["text/plain", "application/json"],
32
+ "defaultOutputModes": ["application/json"],
33
+ "pricing": {
34
+ "free": true,
35
+ "paid": {
36
+ "amount": 25,
37
+ "currency": "USD",
38
+ "interval": "month",
39
+ "url": "https://claw-factory.github.io/truss-site"
40
+ }
41
+ },
42
+ "skills": [
43
+ {
44
+ "id": "api_test_endpoint",
45
+ "name": "HTTP Endpoint Testing",
46
+ "description": "Send HTTP requests to any API endpoint with custom headers, bodies, and authentication",
47
+ "tags": ["api", "http", "testing"],
48
+ "examples": ["Test the POST /users endpoint with this JSON payload", "Check if the health endpoint returns 200"],
49
+ "inputModes": ["text/plain", "application/json"],
50
+ "outputModes": ["application/json"]
51
+ },
52
+ {
53
+ "id": "api_parse_openapi",
54
+ "name": "OpenAPI Spec Parser",
55
+ "description": "Parse and summarize OpenAPI/Swagger specifications, extracting endpoints, schemas, and authentication requirements",
56
+ "tags": ["api", "openapi", "swagger", "documentation"],
57
+ "examples": ["Parse this OpenAPI spec and list all available endpoints"],
58
+ "inputModes": ["text/plain", "application/json"],
59
+ "outputModes": ["application/json"]
60
+ },
61
+ {
62
+ "id": "api_validate_response",
63
+ "name": "Response Validator",
64
+ "description": "Validate API responses against OpenAPI schemas, check status codes, and verify response structure",
65
+ "tags": ["api", "validation", "testing"],
66
+ "examples": ["Validate that this API response matches the expected schema"],
67
+ "inputModes": ["application/json"],
68
+ "outputModes": ["application/json"]
69
+ },
70
+ {
71
+ "id": "api_generate_client",
72
+ "name": "API Client Generator",
73
+ "description": "Generate typed API client code from OpenAPI specs in TypeScript, Python, or Go (Pro)",
74
+ "tags": ["api", "code-generation", "openapi"],
75
+ "examples": ["Generate a TypeScript client for this OpenAPI spec"],
76
+ "inputModes": ["text/plain", "application/json"],
77
+ "outputModes": ["text/plain"]
78
+ },
79
+ {
80
+ "id": "api_mock_server",
81
+ "name": "Mock Server",
82
+ "description": "Create a mock server from an OpenAPI spec that returns realistic fixture data for development (Pro)",
83
+ "tags": ["api", "mock", "testing", "development"],
84
+ "examples": ["Create a mock server for this API spec for local development"],
85
+ "inputModes": ["application/json"],
86
+ "outputModes": ["application/json"]
87
+ }
88
+ ]
89
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Record a tool call for usage-based billing via Stripe Billing Meters.
3
+ * Non-blocking — failures are logged but do not interrupt the tool call.
4
+ * Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
5
+ */
6
+ export declare function recordToolCall(toolName: string): Promise<void>;
7
+ //# sourceMappingURL=billing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/lib/billing.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpE"}
@@ -0,0 +1,31 @@
1
+ import Stripe from 'stripe';
2
+ const stripeKey = process.env.STRIPE_SECRET_KEY;
3
+ const customerId = process.env.STRIPE_CUSTOMER_ID;
4
+ let stripe = null;
5
+ if (stripeKey) {
6
+ stripe = new Stripe(stripeKey);
7
+ }
8
+ /**
9
+ * Record a tool call for usage-based billing via Stripe Billing Meters.
10
+ * Non-blocking — failures are logged but do not interrupt the tool call.
11
+ * Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
12
+ */
13
+ export async function recordToolCall(toolName) {
14
+ if (!stripe || !customerId)
15
+ return;
16
+ try {
17
+ await stripe.billing.meterEvents.create({
18
+ event_name: 'mcp_tool_call',
19
+ payload: {
20
+ stripe_customer_id: customerId,
21
+ value: '1',
22
+ },
23
+ identifier: `${customerId}_${toolName}_${Date.now()}`,
24
+ });
25
+ }
26
+ catch (err) {
27
+ // Non-blocking — log and continue
28
+ console.error(`[billing] meter event failed for ${toolName}:`, err.message);
29
+ }
30
+ }
31
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/lib/billing.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAChD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;AAElD,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,IAAI,SAAS,EAAE,CAAC;IACd,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;QAAE,OAAO;IAEnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;YACtC,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE;gBACP,kBAAkB,EAAE,UAAU;gBAC9B,KAAK,EAAE,GAAG;aACX;YACD,UAAU,EAAE,GAAG,UAAU,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE;SACtD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,kCAAkC;QAClC,OAAO,CAAC,KAAK,CAAC,oCAAoC,QAAQ,GAAG,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IACzF,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"compare-specs.d.ts","sourceRoot":"","sources":["../../src/tools/compare-specs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4D5D"}
1
+ {"version":3,"file":"compare-specs.d.ts","sourceRoot":"","sources":["../../src/tools/compare-specs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6D5D"}
@@ -2,11 +2,13 @@ import { z } from 'zod';
2
2
  import { requirePro } from '../lib/license.js';
3
3
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
4
4
  import { compareSpecs } from '../lib/code-generator.js';
5
+ import { recordToolCall } from '../lib/billing.js';
5
6
  export function registerCompareSpecs(server) {
6
7
  server.tool('compare_specs', '[Pro] Diff two OpenAPI specs and find breaking changes, non-breaking changes, new endpoints, and removed endpoints. Essential for API versioning.', {
7
8
  old_spec: z.string().describe('The old/previous OpenAPI spec as JSON or YAML'),
8
9
  new_spec: z.string().describe('The new/updated OpenAPI spec as JSON or YAML'),
9
10
  }, async ({ old_spec, new_spec }) => {
11
+ recordToolCall('compare_specs').catch(() => { });
10
12
  try {
11
13
  await requirePro();
12
14
  const oldParsed = parseOpenApiSpec(old_spec);
@@ -1 +1 @@
1
- {"version":3,"file":"compare-specs.js","sourceRoot":"","sources":["../../src/tools/compare-specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mJAAmJ,EACnJ;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAC9E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KAC9E,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAEtD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,OAAO,EAAE;gCACP,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,MAAM;gCACpD,oBAAoB,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM;gCACpD,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM;gCAC9C,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,CAAC,MAAM;gCACtD,uBAAuB,EAAE,UAAU,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;6BAClE;4BACD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;4BAC7C,oBAAoB,EAAE,UAAU,CAAC,YAAY;4BAC7C,aAAa,EAAE,UAAU,CAAC,aAAa;4BACvC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;yBAChD,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;iCAChB;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"compare-specs.js","sourceRoot":"","sources":["../../src/tools/compare-specs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,mJAAmJ,EACnJ;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;QAC9E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KAC9E,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC/B,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAEtD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,OAAO,EAAE;gCACP,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,MAAM;gCACpD,oBAAoB,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM;gCACpD,aAAa,EAAE,UAAU,CAAC,aAAa,CAAC,MAAM;gCAC9C,iBAAiB,EAAE,UAAU,CAAC,iBAAiB,CAAC,MAAM;gCACtD,uBAAuB,EAAE,UAAU,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;6BAClE;4BACD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;4BAC7C,oBAAoB,EAAE,UAAU,CAAC,YAAY;4BAC7C,aAAa,EAAE,UAAU,CAAC,aAAa;4BACvC,iBAAiB,EAAE,UAAU,CAAC,iBAAiB;yBAChD,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;iCAChB;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate-client.d.ts","sourceRoot":"","sources":["../../src/tools/generate-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoE9D"}
1
+ {"version":3,"file":"generate-client.d.ts","sourceRoot":"","sources":["../../src/tools/generate-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqE9D"}
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { requirePro } from '../lib/license.js';
3
3
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
4
4
  import { generateClient } from '../lib/code-generator.js';
5
+ import { recordToolCall } from '../lib/billing.js';
5
6
  export function registerGenerateClient(server) {
6
7
  server.tool('generate_client', '[Pro] Generate a typed API client from an OpenAPI spec. Supports TypeScript (fetch/axios), Python (requests), and Go (net/http). Produces ready-to-use code with type definitions.', {
7
8
  spec: z.string().describe('OpenAPI/Swagger spec as JSON or YAML string'),
@@ -14,6 +15,7 @@ export function registerGenerateClient(server) {
14
15
  .default('fetch')
15
16
  .describe('HTTP library style (TypeScript only, default: fetch)'),
16
17
  }, async ({ spec, language, style }) => {
18
+ recordToolCall('generate_client').catch(() => { });
17
19
  try {
18
20
  await requirePro();
19
21
  const parsed = parseOpenApiSpec(spec);
@@ -1 +1 @@
1
- {"version":3,"file":"generate-client.js","sourceRoot":"","sources":["../../src/tools/generate-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oLAAoL,EACpL;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACxE,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;aACpC,QAAQ,CAAC,gCAAgC,CAAC;QAC7C,KAAK,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aACxB,QAAQ,EAAE;aACV,OAAO,CAAC,OAAO,CAAC;aAChB,QAAQ,CAAC,sDAAsD,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAErD,MAAM,UAAU,GAA2B;gBACzC,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,KAAK;gBACb,EAAE,EAAE,KAAK;aACV,CAAC;YAEF,MAAM,QAAQ,GAAG,aAAa,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAErD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,QAAQ;4BACR,QAAQ;4BACR,KAAK,EAAE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;4BACpD,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;4BACvC,IAAI;yBACL,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;iCAChB;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"generate-client.js","sourceRoot":"","sources":["../../src/tools/generate-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oLAAoL,EACpL;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACxE,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;aACpC,QAAQ,CAAC,gCAAgC,CAAC;QAC7C,KAAK,EAAE,CAAC;aACL,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;aACxB,QAAQ,EAAE;aACV,OAAO,CAAC,OAAO,CAAC;aAChB,QAAQ,CAAC,sDAAsD,CAAC;KACpE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;QAClC,cAAc,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YAErD,MAAM,UAAU,GAA2B;gBACzC,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,KAAK;gBACb,EAAE,EAAE,KAAK;aACV,CAAC;YAEF,MAAM,QAAQ,GAAG,aAAa,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAErD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,QAAQ;4BACR,QAAQ;4BACR,KAAK,EAAE,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;4BACpD,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;4BACvC,IAAI;yBACL,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;iCAChB;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate-openapi.d.ts","sourceRoot":"","sources":["../../src/tools/generate-openapi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6D/D"}
1
+ {"version":3,"file":"generate-openapi.d.ts","sourceRoot":"","sources":["../../src/tools/generate-openapi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8D/D"}
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { requirePro } from '../lib/license.js';
3
3
  import { generateOpenApiFromExamples } from '../lib/openapi-parser.js';
4
+ import { recordToolCall } from '../lib/billing.js';
4
5
  export function registerGenerateOpenApi(server) {
5
6
  server.tool('generate_openapi', '[Pro] Auto-generate an OpenAPI 3.0 spec from example requests and responses. Infers schemas, path parameters, query parameters, and response types.', {
6
7
  examples: z.array(z.object({
@@ -12,6 +13,7 @@ export function registerGenerateOpenApi(server) {
12
13
  headers: z.record(z.string(), z.string()).optional().describe('Request headers'),
13
14
  })).min(1).describe('Array of example request/response pairs'),
14
15
  }, async ({ examples }) => {
16
+ recordToolCall('generate_openapi').catch(() => { });
15
17
  try {
16
18
  await requirePro();
17
19
  const yamlSpec = generateOpenApiFromExamples(examples);
@@ -1 +1 @@
1
- {"version":3,"file":"generate-openapi.js","sourceRoot":"","sources":["../../src/tools/generate-openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qJAAqJ,EACrJ;QACE,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACnD,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAClE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SACjF,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KAC7D,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,QAAQ,GAAG,2BAA2B,CAAC,QAAkD,CAAC,CAAC;YAEjG,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,QAAQ;qBACf;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;oCACf,QAAQ,EAAE;wCACR,sCAAsC;wCACtC,0BAA0B;wCAC1B,wBAAwB;wCACxB,6CAA6C;wCAC7C,uCAAuC;qCACxC;iCACF;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"generate-openapi.js","sourceRoot":"","sources":["../../src/tools/generate-openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,qJAAqJ,EACrJ;QACE,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC5D,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACnD,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAClE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAC/C,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;SACjF,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KAC7D,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,cAAc,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,QAAQ,GAAG,2BAA2B,CAAC,QAAkD,CAAC,CAAC;YAEjG,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,QAAQ;qBACf;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;oCACf,QAAQ,EAAE;wCACR,sCAAsC;wCACtC,0BAA0B;wCAC1B,wBAAwB;wCACxB,6CAA6C;wCAC7C,uCAAuC;qCACxC;iCACF;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate-tests.d.ts","sourceRoot":"","sources":["../../src/tools/generate-tests.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8D7D"}
1
+ {"version":3,"file":"generate-tests.d.ts","sourceRoot":"","sources":["../../src/tools/generate-tests.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+D7D"}
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { requirePro } from '../lib/license.js';
3
3
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
4
4
  import { generateTests } from '../lib/code-generator.js';
5
+ import { recordToolCall } from '../lib/billing.js';
5
6
  export function registerGenerateTests(server) {
6
7
  server.tool('generate_tests', '[Pro] Generate a complete API test suite from an OpenAPI spec. Supports Jest, Vitest, and Pytest frameworks. Generates happy-path and error-case tests.', {
7
8
  spec: z.string().describe('OpenAPI/Swagger spec as JSON or YAML string'),
@@ -12,6 +13,7 @@ export function registerGenerateTests(server) {
12
13
  .default('vitest')
13
14
  .describe('Test framework to generate for (default: vitest)'),
14
15
  }, async ({ spec, base_url, framework }) => {
16
+ recordToolCall('generate_tests').catch(() => { });
15
17
  try {
16
18
  await requirePro();
17
19
  const parsed = parseOpenApiSpec(spec);
@@ -1 +1 @@
1
- {"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../src/tools/generate-tests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,yJAAyJ,EACzJ;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;QAC1F,SAAS,EAAE,CAAC;aACT,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAClC,QAAQ,EAAE;aACV,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CAAC,kDAAkD,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAE5D,MAAM,QAAQ,GACZ,SAAS,KAAK,QAAQ;gBACpB,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,YAAY,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEvD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,QAAQ;4BACR,SAAS;4BACT,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;4BACvC,IAAI,EAAE,QAAQ;yBACf,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;iCAChB;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../src/tools/generate-tests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,yJAAyJ,EACzJ;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACxE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;QAC1F,SAAS,EAAE,CAAC;aACT,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;aAClC,QAAQ,EAAE;aACV,OAAO,CAAC,QAAQ,CAAC;aACjB,QAAQ,CAAC,kDAAkD,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;QACtC,cAAc,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAE5D,MAAM,QAAQ,GACZ,SAAS,KAAK,QAAQ;gBACpB,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,YAAY,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAEvD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,QAAQ;4BACR,SAAS;4BACT,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;4BACvC,IAAI,EAAE,QAAQ;yBACf,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;iCAChB;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../../src/tools/mock-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA6D1D"}
1
+ {"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../../src/tools/mock-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8D1D"}
@@ -2,10 +2,12 @@ import { z } from 'zod';
2
2
  import { requirePro } from '../lib/license.js';
3
3
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
4
4
  import { generateMockServer } from '../lib/code-generator.js';
5
+ import { recordToolCall } from '../lib/billing.js';
5
6
  export function registerMockServer(server) {
6
7
  server.tool('mock_server', '[Pro] Generate a mock server configuration from an OpenAPI spec. Produces routes with sample responses and a db.json file ready for json-server or similar.', {
7
8
  spec: z.string().describe('OpenAPI/Swagger spec as JSON or YAML string'),
8
9
  }, async ({ spec }) => {
10
+ recordToolCall('mock_server').catch(() => { });
9
11
  try {
10
12
  await requirePro();
11
13
  const parsed = parseOpenApiSpec(spec);
@@ -1 +1 @@
1
- {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/tools/mock-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,6JAA6J,EAC7J;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACzE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAE9C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM;4BACrC,MAAM,EAAE,UAAU,CAAC,MAAM;4BACzB,SAAS,EAAE,UAAU,CAAC,SAAS;4BAC/B,kBAAkB,EAAE;gCAClB,WAAW,EAAE;oCACX,8BAA8B;oCAC9B,wCAAwC;oCACxC,8CAA8C;iCAC/C;gCACD,MAAM,EAAE;oCACN,oDAAoD;oCACpD,0DAA0D;iCAC3D;6BACF;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;iCAChB;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/tools/mock-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,6JAA6J,EAC7J;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACzE,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,cAAc,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,UAAU,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAE9C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,MAAM;4BACrC,MAAM,EAAE,UAAU,CAAC,MAAM;4BACzB,SAAS,EAAE,UAAU,CAAC,SAAS;4BAC/B,kBAAkB,EAAE;gCAClB,WAAW,EAAE;oCACX,8BAA8B;oCAC9B,wCAAwC;oCACxC,8CAA8C;iCAC/C;gCACD,MAAM,EAAE;oCACN,oDAAoD;oCACpD,0DAA0D;iCAC3D;6BACF;yBACF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAExD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,OAAO;4BACd,GAAG,CAAC,SAAS;gCACX,CAAC,CAAC;oCACE,WAAW,EAAE,2BAA2B;oCACxC,KAAK,EAAE,QAAQ;iCAChB;gCACH,CAAC,CAAC,EAAE,CAAC;yBACR,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"parse-openapi.d.ts","sourceRoot":"","sources":["../../src/tools/parse-openapi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiD5D"}
1
+ {"version":3,"file":"parse-openapi.d.ts","sourceRoot":"","sources":["../../src/tools/parse-openapi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkD5D"}
@@ -1,9 +1,11 @@
1
1
  import { z } from 'zod';
2
2
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
3
+ import { recordToolCall } from '../lib/billing.js';
3
4
  export function registerParseOpenApi(server) {
4
5
  server.tool('parse_openapi', 'Parse an OpenAPI 3.x or Swagger 2.0 spec (JSON or YAML) and list all endpoints with their parameters, request bodies, and response schemas.', {
5
6
  spec: z.string().describe('OpenAPI/Swagger spec content as JSON or YAML string'),
6
7
  }, async ({ spec }) => {
8
+ recordToolCall('parse_openapi').catch(() => { });
7
9
  try {
8
10
  const parsed = parseOpenApiSpec(spec);
9
11
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"parse-openapi.js","sourceRoot":"","sources":["../../src/tools/parse-openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,6IAA6I,EAC7I;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KACjF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAEtC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;4BACvC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gCACvC,MAAM,EAAE,EAAE,CAAC,MAAM;gCACjB,IAAI,EAAE,EAAE,CAAC,IAAI;gCACb,OAAO,EAAE,EAAE,CAAC,OAAO;gCACnB,WAAW,EAAE,EAAE,CAAC,WAAW;gCAC3B,IAAI,EAAE,EAAE,CAAC,IAAI;gCACb,UAAU,EAAE,EAAE,CAAC,UAAU;gCACzB,YAAY,EAAE,EAAE,CAAC,WAAW;gCAC5B,SAAS,EAAE,EAAE,CAAC,SAAS;6BACxB,CAAC,CAAC;yBACJ,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;4BACvD,IAAI,EAAE,yEAAyE;yBAChF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"parse-openapi.js","sourceRoot":"","sources":["../../src/tools/parse-openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,6IAA6I,EAC7I;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;KACjF,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAEtC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,IAAI,EAAE,MAAM,CAAC,IAAI;4BACjB,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,cAAc,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM;4BACvC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gCACvC,MAAM,EAAE,EAAE,CAAC,MAAM;gCACjB,IAAI,EAAE,EAAE,CAAC,IAAI;gCACb,OAAO,EAAE,EAAE,CAAC,OAAO;gCACnB,WAAW,EAAE,EAAE,CAAC,WAAW;gCAC3B,IAAI,EAAE,EAAE,CAAC,IAAI;gCACb,UAAU,EAAE,EAAE,CAAC,UAAU;gCACzB,YAAY,EAAE,EAAE,CAAC,WAAW;gCAC5B,SAAS,EAAE,EAAE,CAAC,SAAS;6BACxB,CAAC,CAAC;yBACJ,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;4BACvD,IAAI,EAAE,yEAAyE;yBAChF,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"test-endpoint.d.ts","sourceRoot":"","sources":["../../src/tools/test-endpoint.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkE5D"}
1
+ {"version":3,"file":"test-endpoint.d.ts","sourceRoot":"","sources":["../../src/tools/test-endpoint.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmE5D"}
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { executeRequest } from '../lib/http-client.js';
3
+ import { recordToolCall } from '../lib/billing.js';
3
4
  export function registerTestEndpoint(server) {
4
5
  server.tool('test_endpoint', 'Send an HTTP request and get a structured response with status, headers, body, timing, and size. Supports GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.', {
5
6
  method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS']).describe('HTTP method'),
@@ -8,6 +9,7 @@ export function registerTestEndpoint(server) {
8
9
  body: z.unknown().optional().describe('Request body (auto-serialized to JSON for objects)'),
9
10
  timeout: z.number().min(100).max(120000).optional().describe('Request timeout in milliseconds (default: 30000, max: 120000)'),
10
11
  }, async ({ method, url, headers, body, timeout }) => {
12
+ recordToolCall('test_endpoint').catch(() => { });
11
13
  try {
12
14
  const response = await executeRequest({
13
15
  method,
@@ -1 +1 @@
1
- {"version":3,"file":"test-endpoint.js","sourceRoot":"","sources":["../../src/tools/test-endpoint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-endpoint.js","sourceRoot":"","sources":["../../src/tools/test-endpoint.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-response.d.ts","sourceRoot":"","sources":["../../src/tools/validate-response.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiDhE"}
1
+ {"version":3,"file":"validate-response.d.ts","sourceRoot":"","sources":["../../src/tools/validate-response.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkDhE"}
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { validateResponse } from '../lib/schema-validator.js';
3
+ import { recordToolCall } from '../lib/billing.js';
3
4
  export function registerValidateResponse(server) {
4
5
  server.tool('validate_response', 'Validate an API response against an expected HTTP status code and optional JSON Schema. Returns validation result with detailed error messages.', {
5
6
  response: z.object({
@@ -9,6 +10,7 @@ export function registerValidateResponse(server) {
9
10
  expected_status: z.number().describe('Expected HTTP status code'),
10
11
  expected_schema: z.unknown().optional().describe('Expected JSON Schema (draft-07) for the response body'),
11
12
  }, async ({ response, expected_status, expected_schema }) => {
13
+ recordToolCall('validate_response').catch(() => { });
12
14
  try {
13
15
  const result = validateResponse(response, expected_status, expected_schema ?? undefined);
14
16
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"validate-response.js","sourceRoot":"","sources":["../../src/tools/validate-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,iJAAiJ,EACjJ;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACjE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SACxD,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC3C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACjE,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;KAC1G,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,EAAE,EAAE;QACvD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,CAC7B,QAA6C,EAC7C,eAAe,EACd,eAAoD,IAAI,SAAS,CACnE,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,GAAG,CAAC,MAAM,CAAC,KAAK;gCACd,CAAC,CAAC,EAAE,OAAO,EAAE,8CAA8C,EAAE;gCAC7D,CAAC,CAAC,EAAE,OAAO,EAAE,0BAA0B,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,EAAE,CAAC;yBAC7E,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"validate-response.js","sourceRoot":"","sources":["../../src/tools/validate-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,iJAAiJ,EACjJ;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YACjE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;SACxD,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC3C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QACjE,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;KAC1G,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,EAAE,EAAE;QACvD,cAAc,CAAC,mBAAmB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,CAC7B,QAA6C,EAC7C,eAAe,EACd,eAAoD,IAAI,SAAS,CACnE,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,MAAM,CAAC,KAAK;4BACnB,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,GAAG,CAAC,MAAM,CAAC,KAAK;gCACd,CAAC,CAAC,EAAE,OAAO,EAAE,8CAA8C,EAAE;gCAC7D,CAAC,CAAC,EAAE,OAAO,EAAE,0BAA0B,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,EAAE,CAAC;yBAC7E,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACnB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;yBACxD,EAAE,IAAI,EAAE,CAAC,CAAC;qBACZ;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
package/mcpize.yaml ADDED
@@ -0,0 +1,17 @@
1
+ # MCPize manifest - https://mcpize.com
2
+ # Generated by mcpize analyze
3
+ version: 1
4
+ runtime: typescript
5
+ build:
6
+ install: npm install
7
+ command: npm run build
8
+ startCommand:
9
+ type: stdio
10
+ command: node dist/index.js
11
+ credentials:
12
+ - name: TRUSS_LICENSE_KEY
13
+ required: false
14
+ description: License key for Pro features (optional)
15
+ mapping:
16
+ env: TRUSS_LICENSE_KEY
17
+ credentials_mode: per_user
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "truss-api-mcp",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "API testing and documentation tools for Claude Code — test endpoints, parse OpenAPI specs, generate clients and tests",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,24 +14,36 @@
14
14
  },
15
15
  "keywords": [
16
16
  "mcp",
17
+ "mcp-server",
18
+ "model-context-protocol",
17
19
  "api",
20
+ "api-testing",
18
21
  "testing",
19
22
  "openapi",
20
23
  "swagger",
24
+ "rest",
21
25
  "documentation",
22
26
  "claude",
23
- "claude-code"
27
+ "claude-code",
28
+ "cursor",
29
+ "ai",
30
+ "ai-agent",
31
+ "agent",
32
+ "http",
33
+ "tool"
24
34
  ],
25
35
  "author": "TRUSS",
26
36
  "license": "MIT",
27
37
  "dependencies": {
28
38
  "@modelcontextprotocol/sdk": "^1.12.0",
29
- "js-yaml": "^4.1.0"
39
+ "js-yaml": "^4.1.0",
40
+ "stripe": "^21.0.1"
30
41
  },
31
42
  "devDependencies": {
32
43
  "typescript": "^5.5.0",
33
44
  "tsx": "^4.19.0",
34
45
  "@types/js-yaml": "^4.0.9",
35
46
  "@types/node": "^22.0.0"
36
- }
47
+ },
48
+ "mcpName": "io.github.claw-factory/truss-api-mcp"
37
49
  }
package/server.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.claw-factory/truss-api-mcp",
4
+ "title": "TRUSS API MCP — API Testing and Docs",
5
+ "description": "API testing and documentation MCP server",
6
+ "version": "1.0.1",
7
+ "packages": [
8
+ {
9
+ "registryType": "npm",
10
+ "identifier": "truss-api-mcp",
11
+ "version": "1.0.1",
12
+ "runtimeHint": "node",
13
+ "transport": {
14
+ "type": "stdio"
15
+ }
16
+ }
17
+ ],
18
+ "sourceUrl": "https://github.com/claw-factory/truss-api-mcp",
19
+ "license": "MIT"
20
+ }
@@ -0,0 +1,34 @@
1
+ import Stripe from 'stripe';
2
+
3
+ const stripeKey = process.env.STRIPE_SECRET_KEY;
4
+ const customerId = process.env.STRIPE_CUSTOMER_ID;
5
+
6
+ let stripe: Stripe | null = null;
7
+
8
+ if (stripeKey) {
9
+ stripe = new Stripe(stripeKey);
10
+ }
11
+
12
+ /**
13
+ * Record a tool call for usage-based billing via Stripe Billing Meters.
14
+ * Non-blocking — failures are logged but do not interrupt the tool call.
15
+ * Requires STRIPE_SECRET_KEY and STRIPE_CUSTOMER_ID env vars.
16
+ */
17
+ export async function recordToolCall(toolName: string): Promise<void> {
18
+ if (!stripe || !customerId) return;
19
+
20
+ try {
21
+ await stripe.billing.meterEvents.create({
22
+ event_name: 'mcp_tool_call',
23
+ payload: {
24
+ stripe_customer_id: customerId,
25
+ value: '1',
26
+ },
27
+ identifier: `${customerId}_${toolName}_${Date.now()}`,
28
+ });
29
+ } catch (err) {
30
+ // Non-blocking — log and continue
31
+ console.error(`[billing] meter event failed for ${toolName}:`, (err as Error).message);
32
+ }
33
+ }
34
+
@@ -3,6 +3,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { requirePro } from '../lib/license.js';
4
4
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
5
5
  import { compareSpecs } from '../lib/code-generator.js';
6
+ import { recordToolCall } from '../lib/billing.js';
6
7
 
7
8
  export function registerCompareSpecs(server: McpServer): void {
8
9
  server.tool(
@@ -13,6 +14,7 @@ export function registerCompareSpecs(server: McpServer): void {
13
14
  new_spec: z.string().describe('The new/updated OpenAPI spec as JSON or YAML'),
14
15
  },
15
16
  async ({ old_spec, new_spec }) => {
17
+ recordToolCall('compare_specs').catch(() => {});
16
18
  try {
17
19
  await requirePro();
18
20
 
@@ -3,6 +3,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { requirePro } from '../lib/license.js';
4
4
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
5
5
  import { generateClient } from '../lib/code-generator.js';
6
+ import { recordToolCall } from '../lib/billing.js';
6
7
 
7
8
  export function registerGenerateClient(server: McpServer): void {
8
9
  server.tool(
@@ -20,6 +21,7 @@ export function registerGenerateClient(server: McpServer): void {
20
21
  .describe('HTTP library style (TypeScript only, default: fetch)'),
21
22
  },
22
23
  async ({ spec, language, style }) => {
24
+ recordToolCall('generate_client').catch(() => {});
23
25
  try {
24
26
  await requirePro();
25
27
 
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { requirePro } from '../lib/license.js';
4
4
  import { generateOpenApiFromExamples } from '../lib/openapi-parser.js';
5
+ import { recordToolCall } from '../lib/billing.js';
5
6
 
6
7
  export function registerGenerateOpenApi(server: McpServer): void {
7
8
  server.tool(
@@ -20,6 +21,7 @@ export function registerGenerateOpenApi(server: McpServer): void {
20
21
  ).min(1).describe('Array of example request/response pairs'),
21
22
  },
22
23
  async ({ examples }) => {
24
+ recordToolCall('generate_openapi').catch(() => {});
23
25
  try {
24
26
  await requirePro();
25
27
 
@@ -3,6 +3,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { requirePro } from '../lib/license.js';
4
4
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
5
5
  import { generateTests } from '../lib/code-generator.js';
6
+ import { recordToolCall } from '../lib/billing.js';
6
7
 
7
8
  export function registerGenerateTests(server: McpServer): void {
8
9
  server.tool(
@@ -18,6 +19,7 @@ export function registerGenerateTests(server: McpServer): void {
18
19
  .describe('Test framework to generate for (default: vitest)'),
19
20
  },
20
21
  async ({ spec, base_url, framework }) => {
22
+ recordToolCall('generate_tests').catch(() => {});
21
23
  try {
22
24
  await requirePro();
23
25
 
@@ -3,6 +3,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { requirePro } from '../lib/license.js';
4
4
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
5
5
  import { generateMockServer } from '../lib/code-generator.js';
6
+ import { recordToolCall } from '../lib/billing.js';
6
7
 
7
8
  export function registerMockServer(server: McpServer): void {
8
9
  server.tool(
@@ -12,6 +13,7 @@ export function registerMockServer(server: McpServer): void {
12
13
  spec: z.string().describe('OpenAPI/Swagger spec as JSON or YAML string'),
13
14
  },
14
15
  async ({ spec }) => {
16
+ recordToolCall('mock_server').catch(() => {});
15
17
  try {
16
18
  await requirePro();
17
19
 
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { parseOpenApiSpec } from '../lib/openapi-parser.js';
4
+ import { recordToolCall } from '../lib/billing.js';
4
5
 
5
6
  export function registerParseOpenApi(server: McpServer): void {
6
7
  server.tool(
@@ -10,6 +11,7 @@ export function registerParseOpenApi(server: McpServer): void {
10
11
  spec: z.string().describe('OpenAPI/Swagger spec content as JSON or YAML string'),
11
12
  },
12
13
  async ({ spec }) => {
14
+ recordToolCall('parse_openapi').catch(() => {});
13
15
  try {
14
16
  const parsed = parseOpenApiSpec(spec);
15
17
 
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { executeRequest } from '../lib/http-client.js';
4
+ import { recordToolCall } from '../lib/billing.js';
4
5
 
5
6
  export function registerTestEndpoint(server: McpServer): void {
6
7
  server.tool(
@@ -14,6 +15,7 @@ export function registerTestEndpoint(server: McpServer): void {
14
15
  timeout: z.number().min(100).max(120000).optional().describe('Request timeout in milliseconds (default: 30000, max: 120000)'),
15
16
  },
16
17
  async ({ method, url, headers, body, timeout }) => {
18
+ recordToolCall('test_endpoint').catch(() => {});
17
19
  try {
18
20
  const response = await executeRequest({
19
21
  method,
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { validateResponse } from '../lib/schema-validator.js';
4
+ import { recordToolCall } from '../lib/billing.js';
4
5
 
5
6
  export function registerValidateResponse(server: McpServer): void {
6
7
  server.tool(
@@ -15,6 +16,7 @@ export function registerValidateResponse(server: McpServer): void {
15
16
  expected_schema: z.unknown().optional().describe('Expected JSON Schema (draft-07) for the response body'),
16
17
  },
17
18
  async ({ response, expected_status, expected_schema }) => {
19
+ recordToolCall('validate_response').catch(() => {});
18
20
  try {
19
21
  const result = validateResponse(
20
22
  response as { status: number; body: unknown },