@mdtidy/mcp 1.1.6 → 1.1.8
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/dist/bin.js +1 -1
- package/dist/{chunk-N4VDC4JK.js → chunk-7P32ARKD.js} +23 -25
- package/dist/chunk-7P32ARKD.js.map +1 -0
- package/dist/http.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/package.json +1 -1
- package/server.json +4 -4
- package/dist/chunk-N4VDC4JK.js.map +0 -1
package/dist/bin.js
CHANGED
|
@@ -45,7 +45,7 @@ function createClient(clientOptions) {
|
|
|
45
45
|
const {
|
|
46
46
|
baseUrl: localBaseUrl,
|
|
47
47
|
fetch = baseFetch,
|
|
48
|
-
Request
|
|
48
|
+
Request = CustomRequest,
|
|
49
49
|
headers,
|
|
50
50
|
params = {},
|
|
51
51
|
parseAs = "json",
|
|
@@ -485,24 +485,15 @@ function removeTrailingSlash(url) {
|
|
|
485
485
|
var DEFAULT_BASE_URL = "https://www.mdtidy.com";
|
|
486
486
|
var DEFAULT_TIMEOUT_MS = 6e4;
|
|
487
487
|
function withTimeout(baseFetch, timeoutMs) {
|
|
488
|
-
return
|
|
489
|
-
|
|
490
|
-
const
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
const body = hasBody ? await input2.text() || void 0 : void 0;
|
|
495
|
-
return baseFetch(
|
|
496
|
-
new Request(input2.url, {
|
|
497
|
-
method: input2.method,
|
|
498
|
-
headers: input2.headers,
|
|
499
|
-
body,
|
|
500
|
-
redirect: input2.redirect,
|
|
501
|
-
signal
|
|
502
|
-
})
|
|
488
|
+
return (input2, init) => {
|
|
489
|
+
let timer;
|
|
490
|
+
const timeout = new Promise((_, reject) => {
|
|
491
|
+
timer = setTimeout(
|
|
492
|
+
() => reject(new Error(`mdtidy request timed out after ${timeoutMs}ms`)),
|
|
493
|
+
timeoutMs
|
|
503
494
|
);
|
|
504
|
-
}
|
|
505
|
-
return baseFetch(input2,
|
|
495
|
+
});
|
|
496
|
+
return Promise.race([baseFetch(input2, init), timeout]).finally(() => clearTimeout(timer));
|
|
506
497
|
};
|
|
507
498
|
}
|
|
508
499
|
function authMiddleware(apiKey) {
|
|
@@ -1072,6 +1063,17 @@ var SERVER_INFO = {
|
|
|
1072
1063
|
};
|
|
1073
1064
|
var PROTOCOL_VERSION = "2025-06-18";
|
|
1074
1065
|
|
|
1066
|
+
// ../../packages/mcp-core/src/server.ts
|
|
1067
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
1068
|
+
function buildMcpServer(ctx, tools) {
|
|
1069
|
+
const server = new McpServer(
|
|
1070
|
+
{ name: SERVER_INFO.name, version: SERVER_INFO.version },
|
|
1071
|
+
{ capabilities: { tools: {} } }
|
|
1072
|
+
);
|
|
1073
|
+
registerTools(server, ctx, tools);
|
|
1074
|
+
return server;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1075
1077
|
// ../../packages/mcp-core/src/jsonrpc.ts
|
|
1076
1078
|
import { zodToJsonSchema } from "zod-to-json-schema";
|
|
1077
1079
|
function toolInputJsonSchema(tool) {
|
|
@@ -1141,7 +1143,6 @@ async function handleJsonRpc(req, ctx, opts = {}) {
|
|
|
1141
1143
|
}
|
|
1142
1144
|
|
|
1143
1145
|
// ../../packages/mcp-core/src/stdio.ts
|
|
1144
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
1145
1146
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
1146
1147
|
async function startStdio(opts = {}) {
|
|
1147
1148
|
const apiKey = opts.apiKey ?? process.env.MDTIDY_API_KEY;
|
|
@@ -1152,11 +1153,7 @@ async function startStdio(opts = {}) {
|
|
|
1152
1153
|
}
|
|
1153
1154
|
const baseUrl = opts.baseUrl ?? process.env.MDTIDY_BASE_URL ?? "https://www.mdtidy.com";
|
|
1154
1155
|
const ctx = buildContext({ apiKey, baseUrl, transport: "stdio" });
|
|
1155
|
-
const server =
|
|
1156
|
-
{ name: SERVER_INFO.name, version: SERVER_INFO.version },
|
|
1157
|
-
{ capabilities: { tools: {} } }
|
|
1158
|
-
);
|
|
1159
|
-
registerTools(server, ctx);
|
|
1156
|
+
const server = buildMcpServer(ctx);
|
|
1160
1157
|
await server.connect(new StdioServerTransport());
|
|
1161
1158
|
}
|
|
1162
1159
|
|
|
@@ -1231,8 +1228,9 @@ export {
|
|
|
1231
1228
|
registerTools,
|
|
1232
1229
|
SERVER_INFO,
|
|
1233
1230
|
PROTOCOL_VERSION,
|
|
1231
|
+
buildMcpServer,
|
|
1234
1232
|
handleJsonRpc,
|
|
1235
1233
|
startStdio,
|
|
1236
1234
|
createMcpRouteHandler
|
|
1237
1235
|
};
|
|
1238
|
-
//# sourceMappingURL=chunk-
|
|
1236
|
+
//# sourceMappingURL=chunk-7P32ARKD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../packages/client/src/errors.ts","../../../node_modules/.pnpm/openapi-fetch@0.13.8/node_modules/openapi-fetch/dist/index.js","../../../packages/client/src/client.ts","../../../packages/mcp-core/src/context.ts","../../../packages/tools/src/catalog.ts","../../../packages/tools/src/tools/read.ts","../../../packages/tools/src/shape.ts","../../../packages/tools/src/types.ts","../../../packages/tools/src/tools/share.ts","../../../packages/tools/src/tools/tidy-markdown.ts","../../../packages/tools/src/tools/write.ts","../../../packages/tools/src/registry.ts","../../../packages/mcp-core/src/register.ts","../../../packages/mcp-core/src/server-info.ts","../../../packages/mcp-core/src/server.ts","../../../packages/mcp-core/src/jsonrpc.ts","../../../packages/mcp-core/src/stdio.ts","../../../packages/mcp-core/src/http.ts"],"sourcesContent":["// Normalized error type for the mdtidy API. The API returns\n// `{ error: { code, message, requestId?, required?, balance? } }` (spec\n// ApiError); we surface it as a typed throwable so tool handlers can branch on\n// `code` (e.g. out_of_credits) without re-parsing.\n\nexport interface ApiErrorBody {\n error: {\n code: string;\n message: string;\n requestId?: string;\n required?: number;\n balance?: number;\n };\n}\n\nexport function isApiErrorBody(value: unknown): value is ApiErrorBody {\n if (typeof value !== 'object' || value === null) return false;\n const err = (value as { error?: unknown }).error;\n return (\n typeof err === 'object' && err !== null && typeof (err as { code?: unknown }).code === 'string'\n );\n}\n\nexport class MdtidyApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly requestId?: string;\n readonly details?: Record<string, unknown>;\n\n constructor(args: {\n status: number;\n code: string;\n message: string;\n requestId?: string;\n details?: Record<string, unknown>;\n }) {\n super(`mdtidy ${args.status} ${args.code}: ${args.message}`);\n this.name = 'MdtidyApiError';\n this.status = args.status;\n this.code = args.code;\n this.requestId = args.requestId;\n this.details = args.details;\n }\n}\n","// settings & const\nconst PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nconst supportsRequestInitExt = () => {\n return (\n typeof process === \"object\" &&\n Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 &&\n process.versions.undici\n );\n};\n\n/**\n * Returns a cheap, non-cryptographically-secure random ID\n * Courtesy of @imranbarbhuiya (https://github.com/imranbarbhuiya)\n */\nexport function randomID() {\n return Math.random().toString(36).slice(2, 11);\n}\n\n/**\n * Create an openapi-fetch client.\n * @type {import(\"./index.js\").default}\n */\nexport default function createClient(clientOptions) {\n let {\n baseUrl = \"\",\n Request: CustomRequest = globalThis.Request,\n fetch: baseFetch = globalThis.fetch,\n querySerializer: globalQuerySerializer,\n bodySerializer: globalBodySerializer,\n headers: baseHeaders,\n requestInitExt = undefined,\n ...baseOptions\n } = { ...clientOptions };\n requestInitExt = supportsRequestInitExt() ? requestInitExt : undefined;\n baseUrl = removeTrailingSlash(baseUrl);\n const middlewares = [];\n\n /**\n * Per-request fetch (keeps settings created in createClient()\n * @param {T} url\n * @param {import('./index.js').FetchOptions<T>} fetchOptions\n */\n async function coreFetch(schemaPath, fetchOptions) {\n const {\n baseUrl: localBaseUrl,\n fetch = baseFetch,\n Request = CustomRequest,\n headers,\n params = {},\n parseAs = \"json\",\n querySerializer: requestQuerySerializer,\n bodySerializer = globalBodySerializer ?? defaultBodySerializer,\n body,\n ...init\n } = fetchOptions || {};\n let finalBaseUrl = baseUrl;\n if (localBaseUrl) {\n finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;\n }\n\n let querySerializer =\n typeof globalQuerySerializer === \"function\"\n ? globalQuerySerializer\n : createQuerySerializer(globalQuerySerializer);\n if (requestQuerySerializer) {\n querySerializer =\n typeof requestQuerySerializer === \"function\"\n ? requestQuerySerializer\n : createQuerySerializer({\n ...(typeof globalQuerySerializer === \"object\" ? globalQuerySerializer : {}),\n ...requestQuerySerializer,\n });\n }\n\n const serializedBody =\n body === undefined\n ? undefined\n : bodySerializer(\n body,\n // Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation:\n // bodySerializer() needs all headers so we aren’t dropping ones set by the user, however,\n // the result of this ALSO sets the lowest-priority content-type header. So we re-merge below,\n // setting the content-type at the very beginning to be overwritten.\n // Lastly, based on the way headers work, it’s not a simple “present-or-not” check becauase null intentionally un-sets headers.\n mergeHeaders(baseHeaders, headers, params.header),\n );\n const finalHeaders = mergeHeaders(\n // with no body, we should not to set Content-Type\n serializedBody === undefined ||\n // if serialized body is FormData; browser will correctly set Content-Type & boundary expression\n serializedBody instanceof FormData\n ? {}\n : {\n \"Content-Type\": \"application/json\",\n },\n baseHeaders,\n headers,\n params.header,\n );\n\n const requestInit = {\n redirect: \"follow\",\n ...baseOptions,\n ...init,\n body: serializedBody,\n headers: finalHeaders,\n };\n\n let id;\n let options;\n let request = new CustomRequest(\n createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),\n requestInit,\n );\n let response;\n\n /** Add custom parameters to Request object */\n for (const key in init) {\n if (!(key in request)) {\n request[key] = init[key];\n }\n }\n\n if (middlewares.length) {\n id = randomID();\n\n // middleware (request)\n options = Object.freeze({\n baseUrl: finalBaseUrl,\n fetch,\n parseAs,\n querySerializer,\n bodySerializer,\n });\n for (const m of middlewares) {\n if (m && typeof m === \"object\" && typeof m.onRequest === \"function\") {\n const result = await m.onRequest({\n request,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (result instanceof CustomRequest) {\n request = result;\n } else if (result instanceof Response) {\n response = result;\n break;\n } else {\n throw new Error(\"onRequest: must return new Request() or Response() when modifying the request\");\n }\n }\n }\n }\n }\n\n if (!response) {\n // fetch!\n try {\n response = await fetch(request, requestInitExt);\n } catch (error) {\n let errorAfterMiddleware = error;\n // middleware (error)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onError === \"function\") {\n const result = await m.onError({\n request,\n error: errorAfterMiddleware,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n // if error is handled by returning a response, skip remaining middleware\n if (result instanceof Response) {\n errorAfterMiddleware = undefined;\n response = result;\n break;\n }\n\n if (result instanceof Error) {\n errorAfterMiddleware = result;\n continue;\n }\n\n throw new Error(\"onError: must return new Response() or instance of Error\");\n }\n }\n }\n }\n\n // rethrow error if not handled by middleware\n if (errorAfterMiddleware) {\n throw errorAfterMiddleware;\n }\n }\n\n // middleware (response)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onResponse === \"function\") {\n const result = await m.onResponse({\n request,\n response,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (!(result instanceof Response)) {\n throw new Error(\"onResponse: must return new Response() when modifying the response\");\n }\n response = result;\n }\n }\n }\n }\n }\n\n // handle empty content\n if (response.status === 204 || request.method === \"HEAD\" || response.headers.get(\"Content-Length\") === \"0\") {\n return response.ok ? { data: undefined, response } : { error: undefined, response };\n }\n\n // parse response (falling back to .text() when necessary)\n if (response.ok) {\n // if \"stream\", skip parsing entirely\n if (parseAs === \"stream\") {\n return { data: response.body, response };\n }\n return { data: await response[parseAs](), response };\n }\n\n // handle errors\n let error = await response.text();\n try {\n error = JSON.parse(error); // attempt to parse as JSON\n } catch {\n // noop\n }\n return { error, response };\n }\n\n return {\n request(method, url, init) {\n return coreFetch(url, { ...init, method: method.toUpperCase() });\n },\n /** Call a GET endpoint */\n GET(url, init) {\n return coreFetch(url, { ...init, method: \"GET\" });\n },\n /** Call a PUT endpoint */\n PUT(url, init) {\n return coreFetch(url, { ...init, method: \"PUT\" });\n },\n /** Call a POST endpoint */\n POST(url, init) {\n return coreFetch(url, { ...init, method: \"POST\" });\n },\n /** Call a DELETE endpoint */\n DELETE(url, init) {\n return coreFetch(url, { ...init, method: \"DELETE\" });\n },\n /** Call a OPTIONS endpoint */\n OPTIONS(url, init) {\n return coreFetch(url, { ...init, method: \"OPTIONS\" });\n },\n /** Call a HEAD endpoint */\n HEAD(url, init) {\n return coreFetch(url, { ...init, method: \"HEAD\" });\n },\n /** Call a PATCH endpoint */\n PATCH(url, init) {\n return coreFetch(url, { ...init, method: \"PATCH\" });\n },\n /** Call a TRACE endpoint */\n TRACE(url, init) {\n return coreFetch(url, { ...init, method: \"TRACE\" });\n },\n /** Register middleware */\n use(...middleware) {\n for (const m of middleware) {\n if (!m) {\n continue;\n }\n if (typeof m !== \"object\" || !(\"onRequest\" in m || \"onResponse\" in m || \"onError\" in m)) {\n throw new Error(\"Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`\");\n }\n middlewares.push(m);\n }\n },\n /** Unregister middleware */\n eject(...middleware) {\n for (const m of middleware) {\n const i = middlewares.indexOf(m);\n if (i !== -1) {\n middlewares.splice(i, 1);\n }\n }\n },\n };\n}\n\nclass PathCallForwarder {\n constructor(client, url) {\n this.client = client;\n this.url = url;\n }\n\n GET = (init) => {\n return this.client.GET(this.url, init);\n };\n PUT = (init) => {\n return this.client.PUT(this.url, init);\n };\n POST = (init) => {\n return this.client.POST(this.url, init);\n };\n DELETE = (init) => {\n return this.client.DELETE(this.url, init);\n };\n OPTIONS = (init) => {\n return this.client.OPTIONS(this.url, init);\n };\n HEAD = (init) => {\n return this.client.HEAD(this.url, init);\n };\n PATCH = (init) => {\n return this.client.PATCH(this.url, init);\n };\n TRACE = (init) => {\n return this.client.TRACE(this.url, init);\n };\n}\n\nclass PathClientProxyHandler {\n constructor() {\n this.client = null;\n }\n\n // Assume the property is an URL.\n get(coreClient, url) {\n const forwarder = new PathCallForwarder(coreClient, url);\n this.client[url] = forwarder;\n return forwarder;\n }\n}\n\n/**\n * Wrap openapi-fetch client to support a path based API.\n * @type {import(\"./index.js\").wrapAsPathBasedClient}\n */\nexport function wrapAsPathBasedClient(coreClient) {\n const handler = new PathClientProxyHandler();\n const proxy = new Proxy(coreClient, handler);\n\n // Put the proxy on the prototype chain of the actual client.\n // This means if we do not have a memoized PathCallForwarder,\n // we fall back to the proxy to synthesize it.\n // However, the proxy itself is not on the hot-path (if we fetch the same\n // endpoint multiple times, only the first call will hit the proxy).\n function Client() {}\n Client.prototype = proxy;\n\n const client = new Client();\n\n // Feed the client back to the proxy handler so it can store the generated\n // PathCallForwarder.\n handler.client = client;\n\n return client;\n}\n\n/**\n * Convenience method to an openapi-fetch path based client.\n * Strictly equivalent to `wrapAsPathBasedClient(createClient(...))`.\n * @type {import(\"./index.js\").createPathBasedClient}\n */\nexport function createPathBasedClient(clientOptions) {\n return wrapAsPathBasedClient(createClient(clientOptions));\n}\n\n// utils\n\n/**\n * Serialize primitive param values\n * @type {import(\"./index.js\").serializePrimitiveParam}\n */\nexport function serializePrimitiveParam(name, value, options) {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n );\n }\n return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;\n}\n\n/**\n * Serialize object param (shallow only)\n * @type {import(\"./index.js\").serializeObjectParam}\n */\nexport function serializeObjectParam(name, value, options) {\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n const values = [];\n const joiner =\n {\n simple: \",\",\n label: \".\",\n matrix: \";\",\n }[options.style] || \"&\";\n\n // explode: false\n if (options.style !== \"deepObject\" && options.explode === false) {\n for (const k in value) {\n values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));\n }\n const final = values.join(\",\"); // note: values are always joined by comma in explode: false (but joiner can prefix)\n switch (options.style) {\n case \"form\": {\n return `${name}=${final}`;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n default: {\n return final;\n }\n }\n }\n\n // explode: true\n for (const k in value) {\n const finalName = options.style === \"deepObject\" ? `${name}[${k}]` : k;\n values.push(serializePrimitiveParam(finalName, value[k], options));\n }\n const final = values.join(joiner);\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${final}` : final;\n}\n\n/**\n * Serialize array param (shallow only)\n * @type {import(\"./index.js\").serializeArrayParam}\n */\nexport function serializeArrayParam(name, value, options) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n\n // explode: false\n if (options.explode === false) {\n const joiner = { form: \",\", spaceDelimited: \"%20\", pipeDelimited: \"|\" }[options.style] || \",\"; // note: for arrays, joiners vary wildly based on style + explode behavior\n const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner);\n switch (options.style) {\n case \"simple\": {\n return final;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n // case \"spaceDelimited\":\n // case \"pipeDelimited\":\n default: {\n return `${name}=${final}`;\n }\n }\n }\n\n // explode: true\n const joiner = { simple: \",\", label: \".\", matrix: \";\" }[options.style] || \"&\";\n const values = [];\n for (const v of value) {\n if (options.style === \"simple\" || options.style === \"label\") {\n values.push(options.allowReserved === true ? v : encodeURIComponent(v));\n } else {\n values.push(serializePrimitiveParam(name, v, options));\n }\n }\n return options.style === \"label\" || options.style === \"matrix\"\n ? `${joiner}${values.join(joiner)}`\n : values.join(joiner);\n}\n\n/**\n * Serialize query params to string\n * @type {import(\"./index.js\").createQuerySerializer}\n */\nexport function createQuerySerializer(options) {\n return function querySerializer(queryParams) {\n const search = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === undefined || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n continue;\n }\n search.push(\n serializeArrayParam(name, value, {\n style: \"form\",\n explode: true,\n ...options?.array,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n if (typeof value === \"object\") {\n search.push(\n serializeObjectParam(name, value, {\n style: \"deepObject\",\n explode: true,\n ...options?.object,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n search.push(serializePrimitiveParam(name, value, options));\n }\n }\n return search.join(\"&\");\n };\n}\n\n/**\n * Handle different OpenAPI 3.x serialization styles\n * @type {import(\"./index.js\").defaultPathSerializer}\n * @see https://swagger.io/docs/specification/serialization/#path\n */\nexport function defaultPathSerializer(pathname, pathParams) {\n let nextURL = pathname;\n for (const match of pathname.match(PATH_PARAM_RE) ?? []) {\n let name = match.substring(1, match.length - 1);\n let explode = false;\n let style = \"simple\";\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith(\".\")) {\n style = \"label\";\n name = name.substring(1);\n } else if (name.startsWith(\";\")) {\n style = \"matrix\";\n name = name.substring(1);\n }\n if (!pathParams || pathParams[name] === undefined || pathParams[name] === null) {\n continue;\n }\n const value = pathParams[name];\n if (Array.isArray(value)) {\n nextURL = nextURL.replace(match, serializeArrayParam(name, value, { style, explode }));\n continue;\n }\n if (typeof value === \"object\") {\n nextURL = nextURL.replace(match, serializeObjectParam(name, value, { style, explode }));\n continue;\n }\n if (style === \"matrix\") {\n nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);\n continue;\n }\n nextURL = nextURL.replace(match, style === \"label\" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));\n }\n return nextURL;\n}\n\n/**\n * Serialize body object to string\n * @type {import(\"./index.js\").defaultBodySerializer}\n */\nexport function defaultBodySerializer(body, headers) {\n if (body instanceof FormData) {\n return body;\n }\n if (headers) {\n const contentType =\n headers.get instanceof Function\n ? (headers.get(\"Content-Type\") ?? headers.get(\"content-type\"))\n : (headers[\"Content-Type\"] ?? headers[\"content-type\"]);\n if (contentType === \"application/x-www-form-urlencoded\") {\n return new URLSearchParams(body).toString();\n }\n }\n return JSON.stringify(body);\n}\n\n/**\n * Construct URL string from baseUrl and handle path and query params\n * @type {import(\"./index.js\").createFinalURL}\n */\nexport function createFinalURL(pathname, options) {\n let finalURL = `${options.baseUrl}${pathname}`;\n if (options.params?.path) {\n finalURL = defaultPathSerializer(finalURL, options.params.path);\n }\n let search = options.querySerializer(options.params.query ?? {});\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n finalURL += `?${search}`;\n }\n return finalURL;\n}\n\n/**\n * Merge headers a and b, with b taking priority\n * @type {import(\"./index.js\").mergeHeaders}\n */\nexport function mergeHeaders(...allHeaders) {\n const finalHeaders = new Headers();\n for (const h of allHeaders) {\n if (!h || typeof h !== \"object\") {\n continue;\n }\n const iterator = h instanceof Headers ? h.entries() : Object.entries(h);\n for (const [k, v] of iterator) {\n if (v === null) {\n finalHeaders.delete(k);\n } else if (Array.isArray(v)) {\n for (const v2 of v) {\n finalHeaders.append(k, v2);\n }\n } else if (v !== undefined) {\n finalHeaders.set(k, v);\n }\n }\n }\n return finalHeaders;\n}\n\n/**\n * Remove trailing slash from url\n * @type {import(\"./index.js\").removeTrailingSlash}\n */\nexport function removeTrailingSlash(url) {\n if (url.endsWith(\"/\")) {\n return url.substring(0, url.length - 1);\n }\n return url;\n}\n","// Typed mdtidy REST client — a thin wrapper over `openapi-fetch` using the\n// generated `paths` type. Adds the dual auth header (X-API-KEY + Bearer, since\n// /convert + /usage read the former and the workspace routes read the latter),\n// a default timeout, and throw-on-error mapping. Spec §3.2, §3.5.\n\nimport createClient, { type Client, type Middleware } from 'openapi-fetch';\n\nimport { isApiErrorBody, MdtidyApiError } from './errors';\nimport type { paths } from './generated/types';\n\n// Canonical host. The apex (mdtidy.com) 307-redirects to www, which breaks\n// server-side self-fetch (the /mcp loopback) — target www directly.\nexport const DEFAULT_BASE_URL = 'https://www.mdtidy.com';\nexport const DEFAULT_TIMEOUT_MS = 60_000;\n\nexport interface MdtidyClientOptions {\n /** mdtidy API key (`mt_live_…` / `mt_test_…`). */\n apiKey: string;\n /** API origin. Defaults to https://www.mdtidy.com. */\n baseUrl?: string;\n /** Injectable fetch (tests, in-process loopback). Defaults to global fetch. */\n fetch?: typeof fetch;\n /** Per-request timeout. Defaults to 60s (PDF/PNG renders can be slow). */\n timeoutMs?: number;\n}\n\nexport type MdtidyClient = Client<paths>;\n\nfunction withTimeout(baseFetch: typeof fetch, timeoutMs: number): typeof fetch {\n // Pass the request through to fetch UNMODIFIED. Reconstructing it to attach a\n // timeout signal (`new Request(...)` / `fetch(req, init)`) re-reads the body\n // and undici rejects it (\"expected non-null body source\" / detached\n // ArrayBuffer) — fragile across undici versions and the bundled runtime.\n // Enforce the timeout with a race instead, so the body is never touched.\n return (input, init) => {\n let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<Response>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`mdtidy request timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n return Promise.race([baseFetch(input, init), timeout]).finally(() => clearTimeout(timer));\n };\n}\n\nfunction authMiddleware(apiKey: string): Middleware {\n return {\n onRequest({ request }) {\n // mdtidy v1 authenticates with X-API-KEY only. `Authorization: Bearer`\n // is blocked globally by the app middleware (reserved for future OAuth\n // Apps), so we must NOT send it. Workspace routes read X-API-KEY via\n // resolveActor; convert/usage read it directly.\n request.headers.set('X-API-KEY', apiKey);\n return request;\n },\n };\n}\n\nconst throwOnError: Middleware = {\n async onResponse({ response }) {\n if (response.ok) return response;\n let body: unknown;\n try {\n body = await response.clone().json();\n } catch {\n body = undefined;\n }\n const err = isApiErrorBody(body) ? body.error : undefined;\n throw new MdtidyApiError({\n status: response.status,\n code: err?.code ?? 'http_error',\n message: err?.message ?? (response.statusText || 'request failed'),\n requestId: err?.requestId,\n details: err ? { required: err.required, balance: err.balance } : undefined,\n });\n },\n};\n\nexport function createMdtidyClient(opts: MdtidyClientOptions): MdtidyClient {\n const baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const baseFetch = opts.fetch ?? globalThis.fetch;\n const client = createClient<paths>({ baseUrl, fetch: withTimeout(baseFetch, timeoutMs) });\n client.use(authMiddleware(opts.apiKey), throwOnError);\n return client;\n}\n","import { createMdtidyClient } from '@mdtidy/client';\nimport type { ToolContext } from '@mdtidy/tools';\n\nexport interface BuildContextOptions {\n apiKey: string;\n baseUrl: string;\n transport: 'stdio' | 'http';\n fetch?: typeof fetch;\n timeoutMs?: number;\n logger?: (message: string) => void;\n}\n\n/** Build the per-invocation ToolContext: a configured client + transport tag. */\nexport function buildContext(opts: BuildContextOptions): ToolContext {\n return {\n client: createMdtidyClient({\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl,\n fetch: opts.fetch,\n timeoutMs: opts.timeoutMs,\n }),\n baseUrl: opts.baseUrl,\n transport: opts.transport,\n logger: opts.logger,\n };\n}\n","// The curated tool catalog — the single source of truth for which API\n// operations become agent tools, and how they're described. Both the registry\n// (packages/tools/src/registry.ts) and the docs generator\n// (scripts/generate.ts → docs/tools.md) read this, so the published tools and\n// the docs can never drift. Spec §3.4.\n\nexport type ToolGroup = 'Convert' | 'Read' | 'Write' | 'Share';\n\nexport interface CatalogEntry {\n /** MCP tool name (snake_case, agent-facing). */\n name: string;\n group: ToolGroup;\n /** Underlying API operation(s). An array means a composite tool. */\n operationId: string | string[];\n /** Credit cost shown to agents: 0 = free, 1 = one credit, '1/0' = create vs update. */\n cost: 0 | 1 | '1/0';\n title: string;\n description: string;\n}\n\nexport const TOOL_CATALOG: CatalogEntry[] = [\n {\n name: 'tidy_markdown',\n group: 'Convert',\n operationId: 'convert',\n cost: 1,\n title: 'Tidy & convert Markdown',\n description:\n 'Clean and repair messy AI-generated Markdown and render it to HTML, plain text, PDF, DOCX, or PNG. ' +\n 'Choose a design system (minimal-clean, executive-report, developer-docs) and optional page geometry. ' +\n 'Costs 1 credit per successful render (auto-refunded on failure); returns the cleanup fixes applied and the remaining balance.',\n },\n {\n name: 'check_usage',\n group: 'Read',\n operationId: 'usage',\n cost: 0,\n title: 'Check credit usage',\n description:\n \"Return the caller's credit balance and recent API calls. Free — call it before a batch of conversions.\",\n },\n {\n name: 'get_entitlement',\n group: 'Read',\n operationId: 'credits',\n cost: 0,\n title: 'Get plan entitlement',\n description: \"Return the caller's plan and workspace gates (can_save / can_share). Free.\",\n },\n {\n name: 'list_projects',\n group: 'Read',\n operationId: 'listProjects',\n cost: 0,\n title: 'List projects',\n description:\n \"List the caller's projects. scope: mine | shared | archived (default mine). Free.\",\n },\n {\n name: 'get_project',\n group: 'Read',\n operationId: 'getProject',\n cost: 0,\n title: 'Get a project',\n description: 'Return a project together with its folders and files. Free.',\n },\n {\n name: 'get_file',\n group: 'Read',\n operationId: 'getFile',\n cost: 0,\n title: 'Read a file',\n description: \"Return a saved file's Markdown content plus its version/ETag. Free.\",\n },\n {\n name: 'create_project',\n group: 'Write',\n operationId: 'createProject',\n cost: 0,\n title: 'Create a project',\n description: 'Create a workspace project (a container for files). Free.',\n },\n {\n name: 'save_document',\n group: 'Write',\n operationId: ['listProjects', 'createProject', 'getProject', 'createFile', 'updateFile'],\n cost: '1/0',\n title: 'Save a document (upsert)',\n description:\n 'Fast path — save Markdown in one step. Finds or creates the target project (default \"Drafts\") and ' +\n 'creates the file, or updates it if a same-named document already exists. 1 credit on create, 0 on update. ' +\n 'Returns the file id, project, and a link. Use this to start fast; use the granular tools for structured workspaces.',\n },\n {\n name: 'save_file',\n group: 'Write',\n operationId: 'createFile',\n cost: 1,\n title: 'Create a file',\n description:\n 'First-save a Markdown file into a known project (idempotent via an idempotency key). 1 credit.',\n },\n {\n name: 'update_file',\n group: 'Write',\n operationId: 'updateFile',\n cost: 0,\n title: 'Update a file',\n description:\n 'Autosave, rename, or move a file. Content writes use If-Match for safe concurrent edits. Free.',\n },\n {\n name: 'get_project_share',\n group: 'Share',\n operationId: 'getProjectShare',\n cost: 0,\n title: 'Get share state',\n description: \"Return a project's current share state and public URL. Free.\",\n },\n {\n name: 'share_project_public',\n group: 'Share',\n operationId: 'enableProjectPublicLink',\n cost: 1,\n title: 'Share a project publicly',\n description:\n \"Turn on a project's public link and return https://mdtidy.com/p/{slug}. 1 credit (free within the 30-day slug grace).\",\n },\n];\n\n/** Look up the curated name/title/description/cost for a tool, so a tool\n * definition and the docs never drift. */\nexport function catalogMeta(\n name: string,\n): Pick<CatalogEntry, 'name' | 'title' | 'description' | 'cost'> {\n const entry = TOOL_CATALOG.find((t) => t.name === name);\n if (!entry) throw new Error(`No catalog entry for tool \"${name}\"`);\n return { name: entry.name, title: entry.title, description: entry.description, cost: entry.cost };\n}\n\n/** Generated + tested but intentionally not exposed in v1 (spec §3.4). One\n * registry entry enables any of these later. */\nexport const DEFERRED_TOOLS: { name: string; operationId: string }[] = [\n { name: 'update_project', operationId: 'updateProject' },\n { name: 'delete_project', operationId: 'deleteProject' },\n { name: 'delete_file', operationId: 'deleteFile' },\n { name: 'copy_file', operationId: 'copyFile' },\n { name: 'create_folder', operationId: 'createFolder' },\n { name: 'update_folder', operationId: 'updateFolder' },\n { name: 'delete_folder', operationId: 'deleteFolder' },\n { name: 'regenerate_public_link', operationId: 'regenerateProjectPublicLink' },\n { name: 'invite_viewers', operationId: 'inviteProjectViewers' },\n { name: 'remove_invitee', operationId: 'removeProjectInvitee' },\n { name: 'make_project_private', operationId: 'makeProjectPrivate' },\n { name: 'disable_public_link', operationId: 'disableProjectPublicLink' },\n];\n","import { z } from 'zod';\n\nimport { catalogMeta } from '../catalog';\nimport { jsonText, result, text } from '../shape';\nimport { defineTool } from '../types';\n\nexport const checkUsage = defineTool({\n ...catalogMeta('check_usage'),\n inputSchema: z.object({}),\n handler: async (_i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/usage', {});\n const u = data!;\n return result(\n text(\n `Credits remaining: ${u.creditsRemaining} (subscription ${u.subscriptionCredits} + top-up ${u.topupCredits}). ` +\n `Calls this period: ${u.callsThisPeriod}.`,\n ),\n jsonText(u),\n );\n },\n});\n\nexport const getEntitlement = defineTool({\n ...catalogMeta('get_entitlement'),\n inputSchema: z.object({}),\n handler: async (_i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/credits', {});\n const e = data!;\n return result(\n text(\n `Plan: ${e.plan}. Balance: ${e.credits_balance}. can_save=${e.can_save} can_share=${e.can_share}.`,\n ),\n jsonText(e),\n );\n },\n});\n\nexport const listProjects = defineTool({\n ...catalogMeta('list_projects'),\n inputSchema: z.object({\n scope: z\n .enum(['mine', 'shared', 'archived'])\n .optional()\n .describe('Which projects to list. Defaults to mine.'),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/projects', {\n params: { query: i.scope ? { scope: i.scope } : {} },\n });\n const d = data!;\n return result(text(`${d.items.length} project(s) in scope \"${d.scope}\".`), jsonText(d.items));\n },\n});\n\nexport const getProject = defineTool({\n ...catalogMeta('get_project'),\n inputSchema: z.object({\n id: z.string().uuid().describe('Project id.'),\n includeArchived: z.boolean().optional().describe('Include archived files. Default false.'),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/projects/{id}', {\n params: {\n path: { id: i.id },\n query: i.includeArchived != null ? { include_archived: i.includeArchived } : {},\n },\n });\n return result(jsonText(data!));\n },\n});\n\nexport const getFile = defineTool({\n ...catalogMeta('get_file'),\n inputSchema: z.object({ id: z.string().uuid().describe('File id.') }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/files/{id}', {\n params: { path: { id: i.id } },\n });\n const f = data!;\n return result(text(`File \"${f.name}\" (v${f.version}). ETag ${f.etag}.`), text(f.content ?? ''));\n },\n});\n","// Result shaping — turn API responses into agent-legible MCP content. Spec §3.4.\n\nimport type { ToolContext } from './context';\nimport type { ContentBlock, ToolResult } from './types';\n\nexport function jsonText(value: unknown): ContentBlock {\n return { type: 'text', text: JSON.stringify(value, null, 2) };\n}\n\nexport function text(value: string): ContentBlock {\n return { type: 'text', text: value };\n}\n\nexport function result(...content: ContentBlock[]): ToolResult {\n return { content };\n}\n\ninterface ConvertResponse {\n format: 'html' | 'text' | 'pdf' | 'docx' | 'png';\n contentType: string;\n byteSize: number;\n designSystem: string;\n output?: string;\n outputBase64?: string;\n warnings: Array<{ rule: string; fixes: number }>;\n creditsCharged: number;\n creditsRemaining: number;\n requestId: string;\n}\n\nexport interface TidyInput {\n format: string;\n savePath?: string;\n}\n\n/** Shape a /convert response per output format (spec §3.4). */\nexport async function shapeConvertResult(\n data: ConvertResponse,\n input: TidyInput,\n ctx: ToolContext,\n): Promise<ToolResult> {\n const fixes =\n data.warnings.length > 0\n ? data.warnings.map((w) => `${w.rule}×${w.fixes}`).join(', ')\n : 'no changes needed';\n const summary =\n `Tidied → ${data.format} (${data.byteSize} bytes, design system \"${data.designSystem}\"). ` +\n `Fixes: ${fixes}. Credits charged ${data.creditsCharged}, remaining ${data.creditsRemaining}.`;\n\n const blocks: ContentBlock[] = [];\n\n if (data.format === 'html' || data.format === 'text') {\n blocks.push(text(data.output ?? ''));\n } else if (data.format === 'png') {\n if (data.outputBase64)\n blocks.push({ type: 'image', data: data.outputBase64, mimeType: 'image/png' });\n } else {\n // pdf / docx\n if (ctx.transport === 'stdio' && input.savePath && data.outputBase64) {\n const { writeFileSync } = await import('node:fs');\n writeFileSync(input.savePath, Buffer.from(data.outputBase64, 'base64'));\n blocks.push(text(`Saved ${data.format.toUpperCase()} to ${input.savePath}`));\n } else if (data.outputBase64) {\n blocks.push({\n type: 'resource',\n resource: {\n uri: `mdtidy://convert/${data.requestId}.${data.format}`,\n mimeType: data.contentType,\n blob: data.outputBase64,\n },\n });\n }\n }\n\n blocks.push(text(summary));\n return { content: blocks };\n}\n","import type { z } from 'zod';\n\nimport type { ToolContext } from './context';\n\n// MCP content blocks a tool may return. Mirrors the subset of the MCP result\n// content union we use; mcp-core maps these to the SDK / JSON-RPC wire shapes.\nexport type ContentBlock =\n | { type: 'text'; text: string }\n | { type: 'image'; data: string; mimeType: string }\n | {\n type: 'resource';\n resource: { uri: string; mimeType?: string; blob?: string; text?: string };\n };\n\nexport interface ToolResult {\n content: ContentBlock[];\n isError?: boolean;\n}\n\n// A tool definition. `inputSchema` is a Zod object whose `.shape` feeds the MCP\n// SDK's `registerTool` (stdio) and whose JSON Schema projection feeds the\n// stateless HTTP `tools/list`. Spec §3.2, §3.4.\nexport interface ToolDef<Schema extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>> {\n name: string;\n title: string;\n description: string;\n inputSchema: Schema;\n /** Credit cost shown to agents (0 = free, 1 = one credit, '1/0' = create vs update). */\n cost: 0 | 1 | '1/0';\n handler: (input: z.infer<Schema>, ctx: ToolContext) => Promise<ToolResult>;\n}\n\n/** Helper to define a tool with inference on the input schema. */\nexport function defineTool<Schema extends z.ZodObject<z.ZodRawShape>>(\n def: ToolDef<Schema>,\n): ToolDef {\n return def as unknown as ToolDef;\n}\n","import { z } from 'zod';\n\nimport { catalogMeta } from '../catalog';\nimport { jsonText, result, text } from '../shape';\nimport { defineTool } from '../types';\n\nexport const getProjectShare = defineTool({\n ...catalogMeta('get_project_share'),\n inputSchema: z.object({ id: z.string().uuid().describe('Project id.') }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/projects/{id}/share', {\n params: { path: { id: i.id } },\n });\n return result(jsonText(data!));\n },\n});\n\nexport const shareProjectPublic = defineTool({\n ...catalogMeta('share_project_public'),\n inputSchema: z.object({\n id: z.string().uuid().describe('Project id.'),\n idempotencyKey: z.string().optional(),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.POST('/api/v1/projects/{id}/share/public', {\n params: {\n path: { id: i.id },\n ...(i.idempotencyKey ? { header: { 'Idempotency-Key': i.idempotencyKey } } : {}),\n },\n });\n const s = data!;\n return result(\n text(`Public link: ${s.public_url ?? s.project_url ?? '(enabled)'}`),\n jsonText(s),\n );\n },\n});\n","import { z } from 'zod';\n\nimport { catalogMeta } from '../catalog';\nimport { shapeConvertResult } from '../shape';\nimport { defineTool } from '../types';\n\nconst input = z.object({\n markdown: z.string().min(1).describe('The Markdown to clean and convert.'),\n format: z\n .enum(['html', 'text', 'pdf', 'docx', 'png'])\n .describe('Output format. html/text return inline; pdf/docx/png return a file or resource.'),\n designSystem: z\n .enum(['minimal-clean', 'executive-report', 'developer-docs'])\n .optional()\n .describe('Visual theme. Defaults to minimal-clean.'),\n page: z\n .object({\n paperSize: z.enum(['Letter', 'A4', 'A3']).optional(),\n orientation: z.enum(['portrait', 'landscape']).optional(),\n marginPreset: z.enum(['narrow', 'normal', 'wide']).optional(),\n fontScale: z.enum(['down', 'normal', 'up']).optional(),\n })\n .optional()\n .describe('Optional page geometry + font scale (render-only; no credit cost).'),\n tidy: z\n .object({\n enable: z.boolean().optional(),\n polish: z.boolean().optional(),\n })\n .optional()\n .describe('Tidy pipeline toggles. Both default to true.'),\n savePath: z\n .string()\n .optional()\n .describe('(stdio only) write binary output (pdf/docx/png) to this local path and return it.'),\n});\n\nexport const tidyMarkdown = defineTool({\n ...catalogMeta('tidy_markdown'),\n inputSchema: input,\n handler: async (i, ctx) => {\n const { data } = await ctx.client.POST('/api/v1/convert', {\n body: {\n markdown: i.markdown,\n format: i.format,\n ...(i.designSystem ? { designSystem: i.designSystem } : {}),\n ...(i.page ? { page: i.page } : {}),\n ...(i.tidy ? { settings: { tidy: i.tidy } } : {}),\n },\n });\n return shapeConvertResult(data!, i, ctx);\n },\n});\n","import { MdtidyApiError } from '@mdtidy/client';\nimport { z } from 'zod';\n\nimport { catalogMeta } from '../catalog';\nimport type { ToolContext } from '../context';\nimport { jsonText, result, text } from '../shape';\nimport { defineTool } from '../types';\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\ninterface FileLike {\n id: string;\n name: string;\n version: number;\n etag: string;\n archived?: boolean;\n credits_remaining?: number;\n}\n\nfunction deriveName(markdown: string): string {\n const heading = markdown.match(/^#\\s+(.+?)\\s*$/m);\n return (heading?.[1] ?? 'Untitled').slice(0, 200);\n}\n\n/** Find-or-create the target project for save_document. Tolerates a 409 on\n * create (concurrent saves converge). Spec §3.4. */\nasync function resolveProject(\n ctx: ToolContext,\n project?: string,\n): Promise<{ id: string; name: string }> {\n const wanted = project?.trim() || 'Drafts';\n if (UUID_RE.test(wanted)) {\n const { data } = await ctx.client.GET('/api/v1/projects/{id}', {\n params: { path: { id: wanted }, query: {} },\n });\n return { id: data!.id, name: data!.name };\n }\n const findByName = async (): Promise<{ id: string; name: string } | undefined> => {\n const { data } = await ctx.client.GET('/api/v1/projects', {\n params: { query: { scope: 'mine' } },\n });\n const found = data!.items.find((p) => p.name === wanted);\n return found ? { id: found.id, name: found.name } : undefined;\n };\n const existing = await findByName();\n if (existing) return existing;\n try {\n const { data } = await ctx.client.POST('/api/v1/projects', { body: { name: wanted } });\n return { id: data!.id, name: data!.name };\n } catch (err) {\n if (err instanceof MdtidyApiError && err.status === 409) {\n const afterRace = await findByName();\n if (afterRace) return afterRace;\n }\n throw err;\n }\n}\n\nasync function patchContent(ctx: ToolContext, fileId: string, etag: string, content: string) {\n const { data } = await ctx.client.PATCH('/api/v1/files/{id}', {\n params: { path: { id: fileId }, header: { 'If-Match': etag } },\n body: { content },\n });\n return data!;\n}\n\nexport const createProject = defineTool({\n ...catalogMeta('create_project'),\n inputSchema: z.object({\n name: z.string().min(1).max(200).describe('Project name.'),\n description: z.string().max(2000).optional(),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.POST('/api/v1/projects', {\n body: { name: i.name, ...(i.description ? { description: i.description } : {}) },\n });\n return result(text(`Created project \"${data!.name}\" (${data!.id}).`), jsonText(data!));\n },\n});\n\nexport const saveFile = defineTool({\n ...catalogMeta('save_file'),\n inputSchema: z.object({\n project_id: z.string().uuid().describe('Target project id.'),\n name: z.string().min(1).max(200),\n content: z.string().describe('Markdown body.'),\n folder_id: z.string().uuid().optional(),\n idempotencyKey: z.string().optional(),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.POST('/api/v1/files', {\n ...(i.idempotencyKey ? { params: { header: { 'Idempotency-Key': i.idempotencyKey } } } : {}),\n body: {\n project_id: i.project_id,\n name: i.name,\n content: i.content,\n ...(i.folder_id ? { folder_id: i.folder_id } : {}),\n },\n });\n return result(\n text(`Saved file \"${data!.name}\" (${data!.id}). 1 credit charged.`),\n jsonText(data!),\n );\n },\n});\n\nexport const updateFile = defineTool({\n ...catalogMeta('update_file'),\n inputSchema: z.object({\n id: z.string().uuid(),\n content: z.string().optional(),\n name: z.string().min(1).max(200).optional(),\n folder_id: z.string().uuid().nullable().optional(),\n archived: z.boolean().optional(),\n ifMatch: z\n .string()\n .optional()\n .describe('ETag/version for safe content writes (required when changing content).'),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.PATCH('/api/v1/files/{id}', {\n params: {\n path: { id: i.id },\n ...(i.ifMatch ? { header: { 'If-Match': i.ifMatch } } : {}),\n },\n body: {\n ...(i.content != null ? { content: i.content } : {}),\n ...(i.name != null ? { name: i.name } : {}),\n ...(i.folder_id !== undefined ? { folder_id: i.folder_id } : {}),\n ...(i.archived != null ? { archived: i.archived } : {}),\n },\n });\n return result(text(`Updated file \"${data!.name}\" (v${data!.version}).`), jsonText(data!));\n },\n});\n\nexport const saveDocument = defineTool({\n ...catalogMeta('save_document'),\n inputSchema: z.object({\n content: z.string().min(1).describe('Markdown body to save.'),\n name: z\n .string()\n .max(200)\n .optional()\n .describe('Document name. Defaults to the first H1, else \"Untitled\".'),\n project: z\n .string()\n .optional()\n .describe('Project id, or a name to find-or-create. Defaults to \"Drafts\".'),\n idempotencyKey: z.string().optional(),\n }),\n handler: async (i, ctx) => {\n const name = i.name?.trim() || deriveName(i.content);\n const project = await resolveProject(ctx, i.project);\n\n const { data: full } = await ctx.client.GET('/api/v1/projects/{id}', {\n params: { path: { id: project.id }, query: {} },\n });\n const files = (full!.files ?? []) as FileLike[];\n const existing = files.find((f) => f.name === name && !f.archived);\n\n let file: FileLike;\n let created: boolean;\n if (existing) {\n try {\n file = (await patchContent(ctx, existing.id, existing.etag, i.content)) as FileLike;\n } catch (err) {\n if (err instanceof MdtidyApiError && err.status === 409) {\n // Stale ETag — re-read and retry once.\n const { data: fresh } = await ctx.client.GET('/api/v1/projects/{id}', {\n params: { path: { id: project.id }, query: {} },\n });\n const again = ((fresh!.files ?? []) as FileLike[]).find(\n (f) => f.name === name && !f.archived,\n );\n if (!again) throw err;\n file = (await patchContent(ctx, again.id, again.etag, i.content)) as FileLike;\n } else {\n throw err;\n }\n }\n created = false;\n } else {\n const { data } = await ctx.client.POST('/api/v1/files', {\n ...(i.idempotencyKey\n ? { params: { header: { 'Idempotency-Key': i.idempotencyKey } } }\n : {}),\n body: { project_id: project.id, name, content: i.content },\n });\n file = data! as FileLike;\n created = true;\n }\n\n const url = `${ctx.baseUrl}/edit/${file.id}`;\n const summary = created\n ? `Created \"${name}\" in project \"${project.name}\". 1 credit charged.`\n : `Updated \"${name}\" in project \"${project.name}\". No credit (update).`;\n return result(\n text(summary),\n jsonText({\n file_id: file.id,\n name,\n project,\n version: file.version,\n etag: file.etag,\n url,\n created,\n creditsRemaining: file.credits_remaining ?? null,\n }),\n );\n },\n});\n","import { checkUsage, getEntitlement, getFile, getProject, listProjects } from './tools/read';\nimport { getProjectShare, shareProjectPublic } from './tools/share';\nimport { tidyMarkdown } from './tools/tidy-markdown';\nimport { createProject, saveDocument, saveFile, updateFile } from './tools/write';\nimport type { ToolDef } from './types';\n\n// The v1 curated tool surface (spec §3.4). Order = how they appear in\n// `tools/list`: the flagship convert first, then read, write (save_document\n// leads the write group as the fast path), then share.\nexport const REGISTRY: ToolDef[] = [\n tidyMarkdown,\n checkUsage,\n getEntitlement,\n listProjects,\n getProject,\n getFile,\n createProject,\n saveDocument,\n saveFile,\n updateFile,\n getProjectShare,\n shareProjectPublic,\n];\n\nexport function getTool(name: string): ToolDef | undefined {\n return REGISTRY.find((t) => t.name === name);\n}\n","import { REGISTRY, type ToolContext, type ToolDef } from '@mdtidy/tools';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\n// Attach every registry tool to an MCP SDK server (the stdio path). Both\n// transports consume the same REGISTRY; this is the SDK projection. Spec §3.3.\nexport function registerTools(\n server: McpServer,\n ctx: ToolContext,\n tools: ToolDef[] = REGISTRY,\n): void {\n for (const tool of tools) {\n server.registerTool(\n tool.name,\n {\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema.shape,\n },\n async (args: unknown) => {\n const res = await tool.handler(args as Record<string, unknown>, ctx);\n return { content: res.content as never, isError: res.isError };\n },\n );\n }\n}\n","// Identity advertised to MCP clients. `version` is the published @mdtidy/mcp\n// version; bumped by changesets at release.\nexport const SERVER_INFO = {\n name: 'mdtidy',\n // Advertised base version (MAJOR.MINOR). The published npm patch is the CI\n // run number; this is informational for MCP clients.\n version: '1.1.0',\n title: 'Markdown Tidy',\n};\n\n/** MCP protocol version this server speaks (echoes the client's request when valid). */\nexport const PROTOCOL_VERSION = '2025-06-18';\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ToolContext, ToolDef } from '@mdtidy/tools';\n\nimport { registerTools } from './register';\nimport { SERVER_INFO } from './server-info';\n\n/**\n * Construct an MCP SDK server with the mdtidy tool surface attached.\n *\n * The single place a server is assembled — shared by the stdio CLI\n * (`startStdio`) and by in-process tests that drive a real MCP session over an\n * in-memory transport. Keeping it here means those tests exercise the exact\n * construction the published `npx @mdtidy/mcp` binary uses, not a copy.\n */\nexport function buildMcpServer(ctx: ToolContext, tools?: ToolDef[]): McpServer {\n const server = new McpServer(\n { name: SERVER_INFO.name, version: SERVER_INFO.version },\n { capabilities: { tools: {} } },\n );\n registerTools(server, ctx, tools);\n return server;\n}\n","// Stateless JSON-RPC 2.0 dispatch for the Streamable-HTTP path (the Vercel\n// /mcp route). Both transports share the same REGISTRY; this is the HTTP\n// projection — no SDK server object, no session state. Spec §3.3, §4.1.\n\nimport { REGISTRY, type ToolContext, type ToolDef } from '@mdtidy/tools';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\n\nimport { PROTOCOL_VERSION, SERVER_INFO } from './server-info';\n\nexport interface JsonRpcRequest {\n jsonrpc: '2.0';\n id?: string | number | null;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport interface DispatchOptions {\n tools?: ToolDef[];\n}\n\nfunction toolInputJsonSchema(tool: ToolDef): Record<string, unknown> {\n const schema = zodToJsonSchema(tool.inputSchema, {\n target: 'jsonSchema7',\n $refStrategy: 'none',\n }) as Record<string, unknown>;\n delete schema.$schema;\n return schema;\n}\n\nexport async function handleJsonRpc(\n req: JsonRpcRequest,\n ctx: ToolContext,\n opts: DispatchOptions = {},\n): Promise<JsonRpcResponse | null> {\n const tools = opts.tools ?? REGISTRY;\n const id = req.id ?? null;\n const ok = (result: unknown): JsonRpcResponse => ({ jsonrpc: '2.0', id, result });\n const fail = (code: number, message: string): JsonRpcResponse => ({\n jsonrpc: '2.0',\n id,\n error: { code, message },\n });\n\n switch (req.method) {\n case 'initialize': {\n const requested = req.params?.protocolVersion;\n return ok({\n protocolVersion: typeof requested === 'string' ? requested : PROTOCOL_VERSION,\n capabilities: { tools: { listChanged: false } },\n serverInfo: SERVER_INFO,\n });\n }\n case 'ping':\n return ok({});\n case 'tools/list':\n return ok({\n tools: tools.map((t) => ({\n name: t.name,\n title: t.title,\n description: t.description,\n inputSchema: toolInputJsonSchema(t),\n })),\n });\n case 'tools/call': {\n const name = req.params?.name as string | undefined;\n const tool = tools.find((t) => t.name === name);\n if (!tool) return fail(-32602, `Unknown tool: ${name}`);\n const parsed = tool.inputSchema.safeParse(req.params?.arguments ?? {});\n if (!parsed.success) {\n const detail = parsed.error.issues\n .map((iss) => `${iss.path.join('.')}: ${iss.message}`)\n .join('; ');\n return fail(-32602, `Invalid arguments for ${name}: ${detail}`);\n }\n try {\n const res = await tool.handler(parsed.data, ctx);\n return ok({ content: res.content, isError: res.isError ?? false });\n } catch (err) {\n // Per MCP, tool execution failures are returned as an error *result*\n // (isError), not a JSON-RPC protocol error, so the model can react.\n // Surface the underlying `cause` (undici wraps network failures as a\n // terse \"fetch failed\" — the cause carries the real reason: ENOTFOUND,\n // ECONNREFUSED, cert errors, …) to the result AND the server log.\n const e = err instanceof Error ? err : new Error(String(err));\n const cause = (e as { cause?: { code?: unknown; message?: unknown } }).cause;\n const causeStr = cause ? ` (cause: ${String(cause.code ?? cause.message ?? cause)})` : '';\n console.error(`[mdtidy-mcp] tool \"${name}\" failed: ${e.message}${causeStr}`);\n return ok({\n content: [{ type: 'text', text: `Error: ${e.message}${causeStr}` }],\n isError: true,\n });\n }\n }\n default:\n // Notifications (no id) need no response.\n if (req.id === undefined || req.method.startsWith('notifications/')) return null;\n return fail(-32601, `Method not found: ${req.method}`);\n }\n}\n","import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { buildContext } from './context';\nimport { buildMcpServer } from './server';\n\nexport interface StdioOptions {\n /** Defaults to process.env.MDTIDY_API_KEY. */\n apiKey?: string;\n /** Defaults to process.env.MDTIDY_BASE_URL ?? https://mdtidy.com. */\n baseUrl?: string;\n}\n\n/** Boot the stdio MCP server (the `npx @mdtidy/mcp` / local-client path). */\nexport async function startStdio(opts: StdioOptions = {}): Promise<void> {\n const apiKey = opts.apiKey ?? process.env.MDTIDY_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'MDTIDY_API_KEY is required. Create a key at https://mdtidy.com/account/api-keys and set it in your MCP client config.',\n );\n }\n const baseUrl = opts.baseUrl ?? process.env.MDTIDY_BASE_URL ?? 'https://www.mdtidy.com';\n const ctx = buildContext({ apiKey, baseUrl, transport: 'stdio' });\n\n const server = buildMcpServer(ctx);\n await server.connect(new StdioServerTransport());\n}\n","// Web-standard, stateless Streamable-HTTP handler for the mdtidy /mcp route.\n// Reads the API key from the request, forwards it to /api/v1/*, and dispatches\n// JSON-RPC against the shared registry. No session state — ideal for Vercel's\n// ephemeral functions. Spec §4.1.\n\nimport { buildContext } from './context';\nimport { handleJsonRpc, type JsonRpcRequest } from './jsonrpc';\n\nexport interface McpRouteHandlerOptions {\n /** Resolve the API origin per request (e.g. the request's own origin for loopback). */\n resolveBaseUrl?: (req: Request) => string;\n /** Fallback API origin. Defaults to https://mdtidy.com. */\n defaultBaseUrl?: string;\n /** Injectable fetch (tests / custom transport). */\n fetch?: typeof fetch;\n}\n\nexport type McpRouteHandler = (req: Request) => Promise<Response>;\n\nfunction json(body: unknown, status: number): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n });\n}\n\nfunction extractApiKey(req: Request): string | undefined {\n const auth = req.headers.get('authorization');\n if (auth && auth.toLowerCase().startsWith('bearer ')) return auth.slice(7).trim();\n const xKey = req.headers.get('x-api-key');\n return xKey?.trim() || undefined;\n}\n\nexport function createMcpRouteHandler(options: McpRouteHandlerOptions = {}): McpRouteHandler {\n return async function handler(req: Request): Promise<Response> {\n // Stateless v1: GET (SSE stream) / DELETE (session teardown) are not used.\n if (req.method === 'GET' || req.method === 'DELETE') {\n return json(\n {\n jsonrpc: '2.0',\n id: null,\n error: { code: -32000, message: 'This MCP server is stateless; use POST.' },\n },\n 405,\n );\n }\n if (req.method !== 'POST') return new Response('Method Not Allowed', { status: 405 });\n\n const apiKey = extractApiKey(req);\n if (!apiKey) {\n return json(\n {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32001,\n message:\n 'Missing API key. Send \"Authorization: Bearer <mdtidy key>\" or \"X-API-KEY\". Create one at https://mdtidy.com/account/api-keys.',\n },\n },\n 401,\n );\n }\n\n let body: unknown;\n try {\n body = await req.json();\n } catch {\n return json(\n { jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } },\n 400,\n );\n }\n\n const baseUrl = options.resolveBaseUrl?.(req) ?? options.defaultBaseUrl ?? 'https://mdtidy.com';\n const ctx = buildContext({ apiKey, baseUrl, transport: 'http', fetch: options.fetch });\n\n if (Array.isArray(body)) {\n const responses = (\n await Promise.all(body.map((m) => handleJsonRpc(m as JsonRpcRequest, ctx)))\n ).filter((r) => r !== null);\n return json(responses, 200);\n }\n\n const res = await handleJsonRpc(body as JsonRpcRequest, ctx);\n if (res === null) return new Response(null, { status: 202 });\n return json(res, 200);\n };\n}\n"],"mappings":"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","names":["result","error","final","joiner","input","input","z","z","z","z","z","z","result"]}
|
package/dist/http.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { BuildContextOptions, JsonRpcRequest, JsonRpcResponse, McpRouteHandler, McpRouteHandlerOptions, PROTOCOL_VERSION, SERVER_INFO, StdioOptions, buildContext, createMcpRouteHandler, handleJsonRpc, registerTools, startStdio } from '@mdtidy/mcp-core';
|
|
1
|
+
export { BuildContextOptions, JsonRpcRequest, JsonRpcResponse, McpRouteHandler, McpRouteHandlerOptions, PROTOCOL_VERSION, SERVER_INFO, StdioOptions, buildContext, buildMcpServer, createMcpRouteHandler, handleJsonRpc, registerTools, startStdio } from '@mdtidy/mcp-core';
|
|
2
2
|
export { CatalogEntry, DEFERRED_TOOLS, REGISTRY, TOOL_CATALOG, ToolContext, ToolDef } from '@mdtidy/tools';
|
|
3
3
|
export { MdtidyApiError, MdtidyClient, MdtidyClientOptions, createMdtidyClient } from '@mdtidy/client';
|
package/dist/index.js
CHANGED
|
@@ -6,12 +6,13 @@ import {
|
|
|
6
6
|
SERVER_INFO,
|
|
7
7
|
TOOL_CATALOG,
|
|
8
8
|
buildContext,
|
|
9
|
+
buildMcpServer,
|
|
9
10
|
createMcpRouteHandler,
|
|
10
11
|
createMdtidyClient,
|
|
11
12
|
handleJsonRpc,
|
|
12
13
|
registerTools,
|
|
13
14
|
startStdio
|
|
14
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-7P32ARKD.js";
|
|
15
16
|
export {
|
|
16
17
|
DEFERRED_TOOLS,
|
|
17
18
|
MdtidyApiError,
|
|
@@ -20,6 +21,7 @@ export {
|
|
|
20
21
|
SERVER_INFO,
|
|
21
22
|
TOOL_CATALOG,
|
|
22
23
|
buildContext,
|
|
24
|
+
buildMcpServer,
|
|
23
25
|
createMcpRouteHandler,
|
|
24
26
|
createMdtidyClient,
|
|
25
27
|
handleJsonRpc,
|
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "com.mdtidy/mcp",
|
|
4
4
|
"description": "Clean, repair, and convert AI-generated Markdown to HTML/PDF/DOCX/PNG; save and share documents.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.1.7",
|
|
6
6
|
"packages": [
|
|
7
7
|
{
|
|
8
8
|
"registryType": "npm",
|
|
9
9
|
"identifier": "@mdtidy/mcp",
|
|
10
|
-
"version": "1.
|
|
10
|
+
"version": "1.1.7",
|
|
11
11
|
"transport": { "type": "stdio" },
|
|
12
12
|
"environmentVariables": [
|
|
13
13
|
{
|
|
@@ -24,5 +24,5 @@
|
|
|
24
24
|
]
|
|
25
25
|
}
|
|
26
26
|
],
|
|
27
|
-
"remotes": [{ "type": "streamable-http", "url": "https://mdtidy.com/mcp" }]
|
|
27
|
+
"remotes": [{ "type": "streamable-http", "url": "https://www.mdtidy.com/mcp" }]
|
|
28
28
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/client/src/errors.ts","../../../node_modules/.pnpm/openapi-fetch@0.13.8/node_modules/openapi-fetch/dist/index.js","../../../packages/client/src/client.ts","../../../packages/mcp-core/src/context.ts","../../../packages/tools/src/catalog.ts","../../../packages/tools/src/tools/read.ts","../../../packages/tools/src/shape.ts","../../../packages/tools/src/types.ts","../../../packages/tools/src/tools/share.ts","../../../packages/tools/src/tools/tidy-markdown.ts","../../../packages/tools/src/tools/write.ts","../../../packages/tools/src/registry.ts","../../../packages/mcp-core/src/register.ts","../../../packages/mcp-core/src/server-info.ts","../../../packages/mcp-core/src/jsonrpc.ts","../../../packages/mcp-core/src/stdio.ts","../../../packages/mcp-core/src/http.ts"],"sourcesContent":["// Normalized error type for the mdtidy API. The API returns\n// `{ error: { code, message, requestId?, required?, balance? } }` (spec\n// ApiError); we surface it as a typed throwable so tool handlers can branch on\n// `code` (e.g. out_of_credits) without re-parsing.\n\nexport interface ApiErrorBody {\n error: {\n code: string;\n message: string;\n requestId?: string;\n required?: number;\n balance?: number;\n };\n}\n\nexport function isApiErrorBody(value: unknown): value is ApiErrorBody {\n if (typeof value !== 'object' || value === null) return false;\n const err = (value as { error?: unknown }).error;\n return (\n typeof err === 'object' && err !== null && typeof (err as { code?: unknown }).code === 'string'\n );\n}\n\nexport class MdtidyApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly requestId?: string;\n readonly details?: Record<string, unknown>;\n\n constructor(args: {\n status: number;\n code: string;\n message: string;\n requestId?: string;\n details?: Record<string, unknown>;\n }) {\n super(`mdtidy ${args.status} ${args.code}: ${args.message}`);\n this.name = 'MdtidyApiError';\n this.status = args.status;\n this.code = args.code;\n this.requestId = args.requestId;\n this.details = args.details;\n }\n}\n","// settings & const\nconst PATH_PARAM_RE = /\\{[^{}]+\\}/g;\n\nconst supportsRequestInitExt = () => {\n return (\n typeof process === \"object\" &&\n Number.parseInt(process?.versions?.node?.substring(0, 2)) >= 18 &&\n process.versions.undici\n );\n};\n\n/**\n * Returns a cheap, non-cryptographically-secure random ID\n * Courtesy of @imranbarbhuiya (https://github.com/imranbarbhuiya)\n */\nexport function randomID() {\n return Math.random().toString(36).slice(2, 11);\n}\n\n/**\n * Create an openapi-fetch client.\n * @type {import(\"./index.js\").default}\n */\nexport default function createClient(clientOptions) {\n let {\n baseUrl = \"\",\n Request: CustomRequest = globalThis.Request,\n fetch: baseFetch = globalThis.fetch,\n querySerializer: globalQuerySerializer,\n bodySerializer: globalBodySerializer,\n headers: baseHeaders,\n requestInitExt = undefined,\n ...baseOptions\n } = { ...clientOptions };\n requestInitExt = supportsRequestInitExt() ? requestInitExt : undefined;\n baseUrl = removeTrailingSlash(baseUrl);\n const middlewares = [];\n\n /**\n * Per-request fetch (keeps settings created in createClient()\n * @param {T} url\n * @param {import('./index.js').FetchOptions<T>} fetchOptions\n */\n async function coreFetch(schemaPath, fetchOptions) {\n const {\n baseUrl: localBaseUrl,\n fetch = baseFetch,\n Request = CustomRequest,\n headers,\n params = {},\n parseAs = \"json\",\n querySerializer: requestQuerySerializer,\n bodySerializer = globalBodySerializer ?? defaultBodySerializer,\n body,\n ...init\n } = fetchOptions || {};\n let finalBaseUrl = baseUrl;\n if (localBaseUrl) {\n finalBaseUrl = removeTrailingSlash(localBaseUrl) ?? baseUrl;\n }\n\n let querySerializer =\n typeof globalQuerySerializer === \"function\"\n ? globalQuerySerializer\n : createQuerySerializer(globalQuerySerializer);\n if (requestQuerySerializer) {\n querySerializer =\n typeof requestQuerySerializer === \"function\"\n ? requestQuerySerializer\n : createQuerySerializer({\n ...(typeof globalQuerySerializer === \"object\" ? globalQuerySerializer : {}),\n ...requestQuerySerializer,\n });\n }\n\n const serializedBody =\n body === undefined\n ? undefined\n : bodySerializer(\n body,\n // Note: we declare mergeHeaders() both here and below because it’s a bit of a chicken-or-egg situation:\n // bodySerializer() needs all headers so we aren’t dropping ones set by the user, however,\n // the result of this ALSO sets the lowest-priority content-type header. So we re-merge below,\n // setting the content-type at the very beginning to be overwritten.\n // Lastly, based on the way headers work, it’s not a simple “present-or-not” check becauase null intentionally un-sets headers.\n mergeHeaders(baseHeaders, headers, params.header),\n );\n const finalHeaders = mergeHeaders(\n // with no body, we should not to set Content-Type\n serializedBody === undefined ||\n // if serialized body is FormData; browser will correctly set Content-Type & boundary expression\n serializedBody instanceof FormData\n ? {}\n : {\n \"Content-Type\": \"application/json\",\n },\n baseHeaders,\n headers,\n params.header,\n );\n\n const requestInit = {\n redirect: \"follow\",\n ...baseOptions,\n ...init,\n body: serializedBody,\n headers: finalHeaders,\n };\n\n let id;\n let options;\n let request = new CustomRequest(\n createFinalURL(schemaPath, { baseUrl: finalBaseUrl, params, querySerializer }),\n requestInit,\n );\n let response;\n\n /** Add custom parameters to Request object */\n for (const key in init) {\n if (!(key in request)) {\n request[key] = init[key];\n }\n }\n\n if (middlewares.length) {\n id = randomID();\n\n // middleware (request)\n options = Object.freeze({\n baseUrl: finalBaseUrl,\n fetch,\n parseAs,\n querySerializer,\n bodySerializer,\n });\n for (const m of middlewares) {\n if (m && typeof m === \"object\" && typeof m.onRequest === \"function\") {\n const result = await m.onRequest({\n request,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (result instanceof CustomRequest) {\n request = result;\n } else if (result instanceof Response) {\n response = result;\n break;\n } else {\n throw new Error(\"onRequest: must return new Request() or Response() when modifying the request\");\n }\n }\n }\n }\n }\n\n if (!response) {\n // fetch!\n try {\n response = await fetch(request, requestInitExt);\n } catch (error) {\n let errorAfterMiddleware = error;\n // middleware (error)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onError === \"function\") {\n const result = await m.onError({\n request,\n error: errorAfterMiddleware,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n // if error is handled by returning a response, skip remaining middleware\n if (result instanceof Response) {\n errorAfterMiddleware = undefined;\n response = result;\n break;\n }\n\n if (result instanceof Error) {\n errorAfterMiddleware = result;\n continue;\n }\n\n throw new Error(\"onError: must return new Response() or instance of Error\");\n }\n }\n }\n }\n\n // rethrow error if not handled by middleware\n if (errorAfterMiddleware) {\n throw errorAfterMiddleware;\n }\n }\n\n // middleware (response)\n // execute in reverse-array order (first priority gets last transform)\n if (middlewares.length) {\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const m = middlewares[i];\n if (m && typeof m === \"object\" && typeof m.onResponse === \"function\") {\n const result = await m.onResponse({\n request,\n response,\n schemaPath,\n params,\n options,\n id,\n });\n if (result) {\n if (!(result instanceof Response)) {\n throw new Error(\"onResponse: must return new Response() when modifying the response\");\n }\n response = result;\n }\n }\n }\n }\n }\n\n // handle empty content\n if (response.status === 204 || request.method === \"HEAD\" || response.headers.get(\"Content-Length\") === \"0\") {\n return response.ok ? { data: undefined, response } : { error: undefined, response };\n }\n\n // parse response (falling back to .text() when necessary)\n if (response.ok) {\n // if \"stream\", skip parsing entirely\n if (parseAs === \"stream\") {\n return { data: response.body, response };\n }\n return { data: await response[parseAs](), response };\n }\n\n // handle errors\n let error = await response.text();\n try {\n error = JSON.parse(error); // attempt to parse as JSON\n } catch {\n // noop\n }\n return { error, response };\n }\n\n return {\n request(method, url, init) {\n return coreFetch(url, { ...init, method: method.toUpperCase() });\n },\n /** Call a GET endpoint */\n GET(url, init) {\n return coreFetch(url, { ...init, method: \"GET\" });\n },\n /** Call a PUT endpoint */\n PUT(url, init) {\n return coreFetch(url, { ...init, method: \"PUT\" });\n },\n /** Call a POST endpoint */\n POST(url, init) {\n return coreFetch(url, { ...init, method: \"POST\" });\n },\n /** Call a DELETE endpoint */\n DELETE(url, init) {\n return coreFetch(url, { ...init, method: \"DELETE\" });\n },\n /** Call a OPTIONS endpoint */\n OPTIONS(url, init) {\n return coreFetch(url, { ...init, method: \"OPTIONS\" });\n },\n /** Call a HEAD endpoint */\n HEAD(url, init) {\n return coreFetch(url, { ...init, method: \"HEAD\" });\n },\n /** Call a PATCH endpoint */\n PATCH(url, init) {\n return coreFetch(url, { ...init, method: \"PATCH\" });\n },\n /** Call a TRACE endpoint */\n TRACE(url, init) {\n return coreFetch(url, { ...init, method: \"TRACE\" });\n },\n /** Register middleware */\n use(...middleware) {\n for (const m of middleware) {\n if (!m) {\n continue;\n }\n if (typeof m !== \"object\" || !(\"onRequest\" in m || \"onResponse\" in m || \"onError\" in m)) {\n throw new Error(\"Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`\");\n }\n middlewares.push(m);\n }\n },\n /** Unregister middleware */\n eject(...middleware) {\n for (const m of middleware) {\n const i = middlewares.indexOf(m);\n if (i !== -1) {\n middlewares.splice(i, 1);\n }\n }\n },\n };\n}\n\nclass PathCallForwarder {\n constructor(client, url) {\n this.client = client;\n this.url = url;\n }\n\n GET = (init) => {\n return this.client.GET(this.url, init);\n };\n PUT = (init) => {\n return this.client.PUT(this.url, init);\n };\n POST = (init) => {\n return this.client.POST(this.url, init);\n };\n DELETE = (init) => {\n return this.client.DELETE(this.url, init);\n };\n OPTIONS = (init) => {\n return this.client.OPTIONS(this.url, init);\n };\n HEAD = (init) => {\n return this.client.HEAD(this.url, init);\n };\n PATCH = (init) => {\n return this.client.PATCH(this.url, init);\n };\n TRACE = (init) => {\n return this.client.TRACE(this.url, init);\n };\n}\n\nclass PathClientProxyHandler {\n constructor() {\n this.client = null;\n }\n\n // Assume the property is an URL.\n get(coreClient, url) {\n const forwarder = new PathCallForwarder(coreClient, url);\n this.client[url] = forwarder;\n return forwarder;\n }\n}\n\n/**\n * Wrap openapi-fetch client to support a path based API.\n * @type {import(\"./index.js\").wrapAsPathBasedClient}\n */\nexport function wrapAsPathBasedClient(coreClient) {\n const handler = new PathClientProxyHandler();\n const proxy = new Proxy(coreClient, handler);\n\n // Put the proxy on the prototype chain of the actual client.\n // This means if we do not have a memoized PathCallForwarder,\n // we fall back to the proxy to synthesize it.\n // However, the proxy itself is not on the hot-path (if we fetch the same\n // endpoint multiple times, only the first call will hit the proxy).\n function Client() {}\n Client.prototype = proxy;\n\n const client = new Client();\n\n // Feed the client back to the proxy handler so it can store the generated\n // PathCallForwarder.\n handler.client = client;\n\n return client;\n}\n\n/**\n * Convenience method to an openapi-fetch path based client.\n * Strictly equivalent to `wrapAsPathBasedClient(createClient(...))`.\n * @type {import(\"./index.js\").createPathBasedClient}\n */\nexport function createPathBasedClient(clientOptions) {\n return wrapAsPathBasedClient(createClient(clientOptions));\n}\n\n// utils\n\n/**\n * Serialize primitive param values\n * @type {import(\"./index.js\").serializePrimitiveParam}\n */\nexport function serializePrimitiveParam(name, value, options) {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n throw new Error(\n \"Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.\",\n );\n }\n return `${name}=${options?.allowReserved === true ? value : encodeURIComponent(value)}`;\n}\n\n/**\n * Serialize object param (shallow only)\n * @type {import(\"./index.js\").serializeObjectParam}\n */\nexport function serializeObjectParam(name, value, options) {\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n const values = [];\n const joiner =\n {\n simple: \",\",\n label: \".\",\n matrix: \";\",\n }[options.style] || \"&\";\n\n // explode: false\n if (options.style !== \"deepObject\" && options.explode === false) {\n for (const k in value) {\n values.push(k, options.allowReserved === true ? value[k] : encodeURIComponent(value[k]));\n }\n const final = values.join(\",\"); // note: values are always joined by comma in explode: false (but joiner can prefix)\n switch (options.style) {\n case \"form\": {\n return `${name}=${final}`;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n default: {\n return final;\n }\n }\n }\n\n // explode: true\n for (const k in value) {\n const finalName = options.style === \"deepObject\" ? `${name}[${k}]` : k;\n values.push(serializePrimitiveParam(finalName, value[k], options));\n }\n const final = values.join(joiner);\n return options.style === \"label\" || options.style === \"matrix\" ? `${joiner}${final}` : final;\n}\n\n/**\n * Serialize array param (shallow only)\n * @type {import(\"./index.js\").serializeArrayParam}\n */\nexport function serializeArrayParam(name, value, options) {\n if (!Array.isArray(value)) {\n return \"\";\n }\n\n // explode: false\n if (options.explode === false) {\n const joiner = { form: \",\", spaceDelimited: \"%20\", pipeDelimited: \"|\" }[options.style] || \",\"; // note: for arrays, joiners vary wildly based on style + explode behavior\n const final = (options.allowReserved === true ? value : value.map((v) => encodeURIComponent(v))).join(joiner);\n switch (options.style) {\n case \"simple\": {\n return final;\n }\n case \"label\": {\n return `.${final}`;\n }\n case \"matrix\": {\n return `;${name}=${final}`;\n }\n // case \"spaceDelimited\":\n // case \"pipeDelimited\":\n default: {\n return `${name}=${final}`;\n }\n }\n }\n\n // explode: true\n const joiner = { simple: \",\", label: \".\", matrix: \";\" }[options.style] || \"&\";\n const values = [];\n for (const v of value) {\n if (options.style === \"simple\" || options.style === \"label\") {\n values.push(options.allowReserved === true ? v : encodeURIComponent(v));\n } else {\n values.push(serializePrimitiveParam(name, v, options));\n }\n }\n return options.style === \"label\" || options.style === \"matrix\"\n ? `${joiner}${values.join(joiner)}`\n : values.join(joiner);\n}\n\n/**\n * Serialize query params to string\n * @type {import(\"./index.js\").createQuerySerializer}\n */\nexport function createQuerySerializer(options) {\n return function querySerializer(queryParams) {\n const search = [];\n if (queryParams && typeof queryParams === \"object\") {\n for (const name in queryParams) {\n const value = queryParams[name];\n if (value === undefined || value === null) {\n continue;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n continue;\n }\n search.push(\n serializeArrayParam(name, value, {\n style: \"form\",\n explode: true,\n ...options?.array,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n if (typeof value === \"object\") {\n search.push(\n serializeObjectParam(name, value, {\n style: \"deepObject\",\n explode: true,\n ...options?.object,\n allowReserved: options?.allowReserved || false,\n }),\n );\n continue;\n }\n search.push(serializePrimitiveParam(name, value, options));\n }\n }\n return search.join(\"&\");\n };\n}\n\n/**\n * Handle different OpenAPI 3.x serialization styles\n * @type {import(\"./index.js\").defaultPathSerializer}\n * @see https://swagger.io/docs/specification/serialization/#path\n */\nexport function defaultPathSerializer(pathname, pathParams) {\n let nextURL = pathname;\n for (const match of pathname.match(PATH_PARAM_RE) ?? []) {\n let name = match.substring(1, match.length - 1);\n let explode = false;\n let style = \"simple\";\n if (name.endsWith(\"*\")) {\n explode = true;\n name = name.substring(0, name.length - 1);\n }\n if (name.startsWith(\".\")) {\n style = \"label\";\n name = name.substring(1);\n } else if (name.startsWith(\";\")) {\n style = \"matrix\";\n name = name.substring(1);\n }\n if (!pathParams || pathParams[name] === undefined || pathParams[name] === null) {\n continue;\n }\n const value = pathParams[name];\n if (Array.isArray(value)) {\n nextURL = nextURL.replace(match, serializeArrayParam(name, value, { style, explode }));\n continue;\n }\n if (typeof value === \"object\") {\n nextURL = nextURL.replace(match, serializeObjectParam(name, value, { style, explode }));\n continue;\n }\n if (style === \"matrix\") {\n nextURL = nextURL.replace(match, `;${serializePrimitiveParam(name, value)}`);\n continue;\n }\n nextURL = nextURL.replace(match, style === \"label\" ? `.${encodeURIComponent(value)}` : encodeURIComponent(value));\n }\n return nextURL;\n}\n\n/**\n * Serialize body object to string\n * @type {import(\"./index.js\").defaultBodySerializer}\n */\nexport function defaultBodySerializer(body, headers) {\n if (body instanceof FormData) {\n return body;\n }\n if (headers) {\n const contentType =\n headers.get instanceof Function\n ? (headers.get(\"Content-Type\") ?? headers.get(\"content-type\"))\n : (headers[\"Content-Type\"] ?? headers[\"content-type\"]);\n if (contentType === \"application/x-www-form-urlencoded\") {\n return new URLSearchParams(body).toString();\n }\n }\n return JSON.stringify(body);\n}\n\n/**\n * Construct URL string from baseUrl and handle path and query params\n * @type {import(\"./index.js\").createFinalURL}\n */\nexport function createFinalURL(pathname, options) {\n let finalURL = `${options.baseUrl}${pathname}`;\n if (options.params?.path) {\n finalURL = defaultPathSerializer(finalURL, options.params.path);\n }\n let search = options.querySerializer(options.params.query ?? {});\n if (search.startsWith(\"?\")) {\n search = search.substring(1);\n }\n if (search) {\n finalURL += `?${search}`;\n }\n return finalURL;\n}\n\n/**\n * Merge headers a and b, with b taking priority\n * @type {import(\"./index.js\").mergeHeaders}\n */\nexport function mergeHeaders(...allHeaders) {\n const finalHeaders = new Headers();\n for (const h of allHeaders) {\n if (!h || typeof h !== \"object\") {\n continue;\n }\n const iterator = h instanceof Headers ? h.entries() : Object.entries(h);\n for (const [k, v] of iterator) {\n if (v === null) {\n finalHeaders.delete(k);\n } else if (Array.isArray(v)) {\n for (const v2 of v) {\n finalHeaders.append(k, v2);\n }\n } else if (v !== undefined) {\n finalHeaders.set(k, v);\n }\n }\n }\n return finalHeaders;\n}\n\n/**\n * Remove trailing slash from url\n * @type {import(\"./index.js\").removeTrailingSlash}\n */\nexport function removeTrailingSlash(url) {\n if (url.endsWith(\"/\")) {\n return url.substring(0, url.length - 1);\n }\n return url;\n}\n","// Typed mdtidy REST client — a thin wrapper over `openapi-fetch` using the\n// generated `paths` type. Adds the dual auth header (X-API-KEY + Bearer, since\n// /convert + /usage read the former and the workspace routes read the latter),\n// a default timeout, and throw-on-error mapping. Spec §3.2, §3.5.\n\nimport createClient, { type Client, type Middleware } from 'openapi-fetch';\n\nimport { isApiErrorBody, MdtidyApiError } from './errors';\nimport type { paths } from './generated/types';\n\n// Canonical host. The apex (mdtidy.com) 307-redirects to www, which breaks\n// server-side self-fetch (the /mcp loopback) — target www directly.\nexport const DEFAULT_BASE_URL = 'https://www.mdtidy.com';\nexport const DEFAULT_TIMEOUT_MS = 60_000;\n\nexport interface MdtidyClientOptions {\n /** mdtidy API key (`mt_live_…` / `mt_test_…`). */\n apiKey: string;\n /** API origin. Defaults to https://www.mdtidy.com. */\n baseUrl?: string;\n /** Injectable fetch (tests, in-process loopback). Defaults to global fetch. */\n fetch?: typeof fetch;\n /** Per-request timeout. Defaults to 60s (PDF/PNG renders can be slow). */\n timeoutMs?: number;\n}\n\nexport type MdtidyClient = Client<paths>;\n\nfunction withTimeout(baseFetch: typeof fetch, timeoutMs: number): typeof fetch {\n return async (input, init) => {\n // A caller-supplied signal wins — don't override it.\n if (init?.signal) return baseFetch(input, init);\n const signal = AbortSignal.timeout(timeoutMs);\n // openapi-fetch hands us a fully-built `Request` as `input` (no init).\n // Passing a second init to fetch() makes undici re-read the request body\n // and throw \"expected non-null body source\" for POST/PATCH. Buffer the body\n // first, then reconstruct the request with the timeout signal attached.\n if (input instanceof Request) {\n const method = input.method.toUpperCase();\n // Read the body as a STRING (not ArrayBuffer): a string is re-sendable, so\n // it survives a redirect, whereas an ArrayBuffer gets detached after the\n // first send (undici: \"detached ArrayBuffer\"). Our API bodies are JSON.\n const hasBody = method !== 'GET' && method !== 'HEAD';\n const body = hasBody ? (await input.text()) || undefined : undefined;\n return baseFetch(\n new Request(input.url, {\n method: input.method,\n headers: input.headers,\n body,\n redirect: input.redirect,\n signal,\n }),\n );\n }\n return baseFetch(input, { ...init, signal });\n };\n}\n\nfunction authMiddleware(apiKey: string): Middleware {\n return {\n onRequest({ request }) {\n // mdtidy v1 authenticates with X-API-KEY only. `Authorization: Bearer`\n // is blocked globally by the app middleware (reserved for future OAuth\n // Apps), so we must NOT send it. Workspace routes read X-API-KEY via\n // resolveActor; convert/usage read it directly.\n request.headers.set('X-API-KEY', apiKey);\n return request;\n },\n };\n}\n\nconst throwOnError: Middleware = {\n async onResponse({ response }) {\n if (response.ok) return response;\n let body: unknown;\n try {\n body = await response.clone().json();\n } catch {\n body = undefined;\n }\n const err = isApiErrorBody(body) ? body.error : undefined;\n throw new MdtidyApiError({\n status: response.status,\n code: err?.code ?? 'http_error',\n message: err?.message ?? (response.statusText || 'request failed'),\n requestId: err?.requestId,\n details: err ? { required: err.required, balance: err.balance } : undefined,\n });\n },\n};\n\nexport function createMdtidyClient(opts: MdtidyClientOptions): MdtidyClient {\n const baseUrl = (opts.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const baseFetch = opts.fetch ?? globalThis.fetch;\n const client = createClient<paths>({ baseUrl, fetch: withTimeout(baseFetch, timeoutMs) });\n client.use(authMiddleware(opts.apiKey), throwOnError);\n return client;\n}\n","import { createMdtidyClient } from '@mdtidy/client';\nimport type { ToolContext } from '@mdtidy/tools';\n\nexport interface BuildContextOptions {\n apiKey: string;\n baseUrl: string;\n transport: 'stdio' | 'http';\n fetch?: typeof fetch;\n timeoutMs?: number;\n logger?: (message: string) => void;\n}\n\n/** Build the per-invocation ToolContext: a configured client + transport tag. */\nexport function buildContext(opts: BuildContextOptions): ToolContext {\n return {\n client: createMdtidyClient({\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl,\n fetch: opts.fetch,\n timeoutMs: opts.timeoutMs,\n }),\n baseUrl: opts.baseUrl,\n transport: opts.transport,\n logger: opts.logger,\n };\n}\n","// The curated tool catalog — the single source of truth for which API\n// operations become agent tools, and how they're described. Both the registry\n// (packages/tools/src/registry.ts) and the docs generator\n// (scripts/generate.ts → docs/tools.md) read this, so the published tools and\n// the docs can never drift. Spec §3.4.\n\nexport type ToolGroup = 'Convert' | 'Read' | 'Write' | 'Share';\n\nexport interface CatalogEntry {\n /** MCP tool name (snake_case, agent-facing). */\n name: string;\n group: ToolGroup;\n /** Underlying API operation(s). An array means a composite tool. */\n operationId: string | string[];\n /** Credit cost shown to agents: 0 = free, 1 = one credit, '1/0' = create vs update. */\n cost: 0 | 1 | '1/0';\n title: string;\n description: string;\n}\n\nexport const TOOL_CATALOG: CatalogEntry[] = [\n {\n name: 'tidy_markdown',\n group: 'Convert',\n operationId: 'convert',\n cost: 1,\n title: 'Tidy & convert Markdown',\n description:\n 'Clean and repair messy AI-generated Markdown and render it to HTML, plain text, PDF, DOCX, or PNG. ' +\n 'Choose a design system (minimal-clean, executive-report, developer-docs) and optional page geometry. ' +\n 'Costs 1 credit per successful render (auto-refunded on failure); returns the cleanup fixes applied and the remaining balance.',\n },\n {\n name: 'check_usage',\n group: 'Read',\n operationId: 'usage',\n cost: 0,\n title: 'Check credit usage',\n description:\n \"Return the caller's credit balance and recent API calls. Free — call it before a batch of conversions.\",\n },\n {\n name: 'get_entitlement',\n group: 'Read',\n operationId: 'credits',\n cost: 0,\n title: 'Get plan entitlement',\n description: \"Return the caller's plan and workspace gates (can_save / can_share). Free.\",\n },\n {\n name: 'list_projects',\n group: 'Read',\n operationId: 'listProjects',\n cost: 0,\n title: 'List projects',\n description:\n \"List the caller's projects. scope: mine | shared | archived (default mine). Free.\",\n },\n {\n name: 'get_project',\n group: 'Read',\n operationId: 'getProject',\n cost: 0,\n title: 'Get a project',\n description: 'Return a project together with its folders and files. Free.',\n },\n {\n name: 'get_file',\n group: 'Read',\n operationId: 'getFile',\n cost: 0,\n title: 'Read a file',\n description: \"Return a saved file's Markdown content plus its version/ETag. Free.\",\n },\n {\n name: 'create_project',\n group: 'Write',\n operationId: 'createProject',\n cost: 0,\n title: 'Create a project',\n description: 'Create a workspace project (a container for files). Free.',\n },\n {\n name: 'save_document',\n group: 'Write',\n operationId: ['listProjects', 'createProject', 'getProject', 'createFile', 'updateFile'],\n cost: '1/0',\n title: 'Save a document (upsert)',\n description:\n 'Fast path — save Markdown in one step. Finds or creates the target project (default \"Drafts\") and ' +\n 'creates the file, or updates it if a same-named document already exists. 1 credit on create, 0 on update. ' +\n 'Returns the file id, project, and a link. Use this to start fast; use the granular tools for structured workspaces.',\n },\n {\n name: 'save_file',\n group: 'Write',\n operationId: 'createFile',\n cost: 1,\n title: 'Create a file',\n description:\n 'First-save a Markdown file into a known project (idempotent via an idempotency key). 1 credit.',\n },\n {\n name: 'update_file',\n group: 'Write',\n operationId: 'updateFile',\n cost: 0,\n title: 'Update a file',\n description:\n 'Autosave, rename, or move a file. Content writes use If-Match for safe concurrent edits. Free.',\n },\n {\n name: 'get_project_share',\n group: 'Share',\n operationId: 'getProjectShare',\n cost: 0,\n title: 'Get share state',\n description: \"Return a project's current share state and public URL. Free.\",\n },\n {\n name: 'share_project_public',\n group: 'Share',\n operationId: 'enableProjectPublicLink',\n cost: 1,\n title: 'Share a project publicly',\n description:\n \"Turn on a project's public link and return https://mdtidy.com/p/{slug}. 1 credit (free within the 30-day slug grace).\",\n },\n];\n\n/** Look up the curated name/title/description/cost for a tool, so a tool\n * definition and the docs never drift. */\nexport function catalogMeta(\n name: string,\n): Pick<CatalogEntry, 'name' | 'title' | 'description' | 'cost'> {\n const entry = TOOL_CATALOG.find((t) => t.name === name);\n if (!entry) throw new Error(`No catalog entry for tool \"${name}\"`);\n return { name: entry.name, title: entry.title, description: entry.description, cost: entry.cost };\n}\n\n/** Generated + tested but intentionally not exposed in v1 (spec §3.4). One\n * registry entry enables any of these later. */\nexport const DEFERRED_TOOLS: { name: string; operationId: string }[] = [\n { name: 'update_project', operationId: 'updateProject' },\n { name: 'delete_project', operationId: 'deleteProject' },\n { name: 'delete_file', operationId: 'deleteFile' },\n { name: 'copy_file', operationId: 'copyFile' },\n { name: 'create_folder', operationId: 'createFolder' },\n { name: 'update_folder', operationId: 'updateFolder' },\n { name: 'delete_folder', operationId: 'deleteFolder' },\n { name: 'regenerate_public_link', operationId: 'regenerateProjectPublicLink' },\n { name: 'invite_viewers', operationId: 'inviteProjectViewers' },\n { name: 'remove_invitee', operationId: 'removeProjectInvitee' },\n { name: 'make_project_private', operationId: 'makeProjectPrivate' },\n { name: 'disable_public_link', operationId: 'disableProjectPublicLink' },\n];\n","import { z } from 'zod';\n\nimport { catalogMeta } from '../catalog';\nimport { jsonText, result, text } from '../shape';\nimport { defineTool } from '../types';\n\nexport const checkUsage = defineTool({\n ...catalogMeta('check_usage'),\n inputSchema: z.object({}),\n handler: async (_i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/usage', {});\n const u = data!;\n return result(\n text(\n `Credits remaining: ${u.creditsRemaining} (subscription ${u.subscriptionCredits} + top-up ${u.topupCredits}). ` +\n `Calls this period: ${u.callsThisPeriod}.`,\n ),\n jsonText(u),\n );\n },\n});\n\nexport const getEntitlement = defineTool({\n ...catalogMeta('get_entitlement'),\n inputSchema: z.object({}),\n handler: async (_i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/credits', {});\n const e = data!;\n return result(\n text(\n `Plan: ${e.plan}. Balance: ${e.credits_balance}. can_save=${e.can_save} can_share=${e.can_share}.`,\n ),\n jsonText(e),\n );\n },\n});\n\nexport const listProjects = defineTool({\n ...catalogMeta('list_projects'),\n inputSchema: z.object({\n scope: z\n .enum(['mine', 'shared', 'archived'])\n .optional()\n .describe('Which projects to list. Defaults to mine.'),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/projects', {\n params: { query: i.scope ? { scope: i.scope } : {} },\n });\n const d = data!;\n return result(text(`${d.items.length} project(s) in scope \"${d.scope}\".`), jsonText(d.items));\n },\n});\n\nexport const getProject = defineTool({\n ...catalogMeta('get_project'),\n inputSchema: z.object({\n id: z.string().uuid().describe('Project id.'),\n includeArchived: z.boolean().optional().describe('Include archived files. Default false.'),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/projects/{id}', {\n params: {\n path: { id: i.id },\n query: i.includeArchived != null ? { include_archived: i.includeArchived } : {},\n },\n });\n return result(jsonText(data!));\n },\n});\n\nexport const getFile = defineTool({\n ...catalogMeta('get_file'),\n inputSchema: z.object({ id: z.string().uuid().describe('File id.') }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/files/{id}', {\n params: { path: { id: i.id } },\n });\n const f = data!;\n return result(text(`File \"${f.name}\" (v${f.version}). ETag ${f.etag}.`), text(f.content ?? ''));\n },\n});\n","// Result shaping — turn API responses into agent-legible MCP content. Spec §3.4.\n\nimport type { ToolContext } from './context';\nimport type { ContentBlock, ToolResult } from './types';\n\nexport function jsonText(value: unknown): ContentBlock {\n return { type: 'text', text: JSON.stringify(value, null, 2) };\n}\n\nexport function text(value: string): ContentBlock {\n return { type: 'text', text: value };\n}\n\nexport function result(...content: ContentBlock[]): ToolResult {\n return { content };\n}\n\ninterface ConvertResponse {\n format: 'html' | 'text' | 'pdf' | 'docx' | 'png';\n contentType: string;\n byteSize: number;\n designSystem: string;\n output?: string;\n outputBase64?: string;\n warnings: Array<{ rule: string; fixes: number }>;\n creditsCharged: number;\n creditsRemaining: number;\n requestId: string;\n}\n\nexport interface TidyInput {\n format: string;\n savePath?: string;\n}\n\n/** Shape a /convert response per output format (spec §3.4). */\nexport async function shapeConvertResult(\n data: ConvertResponse,\n input: TidyInput,\n ctx: ToolContext,\n): Promise<ToolResult> {\n const fixes =\n data.warnings.length > 0\n ? data.warnings.map((w) => `${w.rule}×${w.fixes}`).join(', ')\n : 'no changes needed';\n const summary =\n `Tidied → ${data.format} (${data.byteSize} bytes, design system \"${data.designSystem}\"). ` +\n `Fixes: ${fixes}. Credits charged ${data.creditsCharged}, remaining ${data.creditsRemaining}.`;\n\n const blocks: ContentBlock[] = [];\n\n if (data.format === 'html' || data.format === 'text') {\n blocks.push(text(data.output ?? ''));\n } else if (data.format === 'png') {\n if (data.outputBase64)\n blocks.push({ type: 'image', data: data.outputBase64, mimeType: 'image/png' });\n } else {\n // pdf / docx\n if (ctx.transport === 'stdio' && input.savePath && data.outputBase64) {\n const { writeFileSync } = await import('node:fs');\n writeFileSync(input.savePath, Buffer.from(data.outputBase64, 'base64'));\n blocks.push(text(`Saved ${data.format.toUpperCase()} to ${input.savePath}`));\n } else if (data.outputBase64) {\n blocks.push({\n type: 'resource',\n resource: {\n uri: `mdtidy://convert/${data.requestId}.${data.format}`,\n mimeType: data.contentType,\n blob: data.outputBase64,\n },\n });\n }\n }\n\n blocks.push(text(summary));\n return { content: blocks };\n}\n","import type { z } from 'zod';\n\nimport type { ToolContext } from './context';\n\n// MCP content blocks a tool may return. Mirrors the subset of the MCP result\n// content union we use; mcp-core maps these to the SDK / JSON-RPC wire shapes.\nexport type ContentBlock =\n | { type: 'text'; text: string }\n | { type: 'image'; data: string; mimeType: string }\n | {\n type: 'resource';\n resource: { uri: string; mimeType?: string; blob?: string; text?: string };\n };\n\nexport interface ToolResult {\n content: ContentBlock[];\n isError?: boolean;\n}\n\n// A tool definition. `inputSchema` is a Zod object whose `.shape` feeds the MCP\n// SDK's `registerTool` (stdio) and whose JSON Schema projection feeds the\n// stateless HTTP `tools/list`. Spec §3.2, §3.4.\nexport interface ToolDef<Schema extends z.ZodObject<z.ZodRawShape> = z.ZodObject<z.ZodRawShape>> {\n name: string;\n title: string;\n description: string;\n inputSchema: Schema;\n /** Credit cost shown to agents (0 = free, 1 = one credit, '1/0' = create vs update). */\n cost: 0 | 1 | '1/0';\n handler: (input: z.infer<Schema>, ctx: ToolContext) => Promise<ToolResult>;\n}\n\n/** Helper to define a tool with inference on the input schema. */\nexport function defineTool<Schema extends z.ZodObject<z.ZodRawShape>>(\n def: ToolDef<Schema>,\n): ToolDef {\n return def as unknown as ToolDef;\n}\n","import { z } from 'zod';\n\nimport { catalogMeta } from '../catalog';\nimport { jsonText, result, text } from '../shape';\nimport { defineTool } from '../types';\n\nexport const getProjectShare = defineTool({\n ...catalogMeta('get_project_share'),\n inputSchema: z.object({ id: z.string().uuid().describe('Project id.') }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.GET('/api/v1/projects/{id}/share', {\n params: { path: { id: i.id } },\n });\n return result(jsonText(data!));\n },\n});\n\nexport const shareProjectPublic = defineTool({\n ...catalogMeta('share_project_public'),\n inputSchema: z.object({\n id: z.string().uuid().describe('Project id.'),\n idempotencyKey: z.string().optional(),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.POST('/api/v1/projects/{id}/share/public', {\n params: {\n path: { id: i.id },\n ...(i.idempotencyKey ? { header: { 'Idempotency-Key': i.idempotencyKey } } : {}),\n },\n });\n const s = data!;\n return result(\n text(`Public link: ${s.public_url ?? s.project_url ?? '(enabled)'}`),\n jsonText(s),\n );\n },\n});\n","import { z } from 'zod';\n\nimport { catalogMeta } from '../catalog';\nimport { shapeConvertResult } from '../shape';\nimport { defineTool } from '../types';\n\nconst input = z.object({\n markdown: z.string().min(1).describe('The Markdown to clean and convert.'),\n format: z\n .enum(['html', 'text', 'pdf', 'docx', 'png'])\n .describe('Output format. html/text return inline; pdf/docx/png return a file or resource.'),\n designSystem: z\n .enum(['minimal-clean', 'executive-report', 'developer-docs'])\n .optional()\n .describe('Visual theme. Defaults to minimal-clean.'),\n page: z\n .object({\n paperSize: z.enum(['Letter', 'A4', 'A3']).optional(),\n orientation: z.enum(['portrait', 'landscape']).optional(),\n marginPreset: z.enum(['narrow', 'normal', 'wide']).optional(),\n fontScale: z.enum(['down', 'normal', 'up']).optional(),\n })\n .optional()\n .describe('Optional page geometry + font scale (render-only; no credit cost).'),\n tidy: z\n .object({\n enable: z.boolean().optional(),\n polish: z.boolean().optional(),\n })\n .optional()\n .describe('Tidy pipeline toggles. Both default to true.'),\n savePath: z\n .string()\n .optional()\n .describe('(stdio only) write binary output (pdf/docx/png) to this local path and return it.'),\n});\n\nexport const tidyMarkdown = defineTool({\n ...catalogMeta('tidy_markdown'),\n inputSchema: input,\n handler: async (i, ctx) => {\n const { data } = await ctx.client.POST('/api/v1/convert', {\n body: {\n markdown: i.markdown,\n format: i.format,\n ...(i.designSystem ? { designSystem: i.designSystem } : {}),\n ...(i.page ? { page: i.page } : {}),\n ...(i.tidy ? { settings: { tidy: i.tidy } } : {}),\n },\n });\n return shapeConvertResult(data!, i, ctx);\n },\n});\n","import { MdtidyApiError } from '@mdtidy/client';\nimport { z } from 'zod';\n\nimport { catalogMeta } from '../catalog';\nimport type { ToolContext } from '../context';\nimport { jsonText, result, text } from '../shape';\nimport { defineTool } from '../types';\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\ninterface FileLike {\n id: string;\n name: string;\n version: number;\n etag: string;\n archived?: boolean;\n credits_remaining?: number;\n}\n\nfunction deriveName(markdown: string): string {\n const heading = markdown.match(/^#\\s+(.+?)\\s*$/m);\n return (heading?.[1] ?? 'Untitled').slice(0, 200);\n}\n\n/** Find-or-create the target project for save_document. Tolerates a 409 on\n * create (concurrent saves converge). Spec §3.4. */\nasync function resolveProject(\n ctx: ToolContext,\n project?: string,\n): Promise<{ id: string; name: string }> {\n const wanted = project?.trim() || 'Drafts';\n if (UUID_RE.test(wanted)) {\n const { data } = await ctx.client.GET('/api/v1/projects/{id}', {\n params: { path: { id: wanted }, query: {} },\n });\n return { id: data!.id, name: data!.name };\n }\n const findByName = async (): Promise<{ id: string; name: string } | undefined> => {\n const { data } = await ctx.client.GET('/api/v1/projects', {\n params: { query: { scope: 'mine' } },\n });\n const found = data!.items.find((p) => p.name === wanted);\n return found ? { id: found.id, name: found.name } : undefined;\n };\n const existing = await findByName();\n if (existing) return existing;\n try {\n const { data } = await ctx.client.POST('/api/v1/projects', { body: { name: wanted } });\n return { id: data!.id, name: data!.name };\n } catch (err) {\n if (err instanceof MdtidyApiError && err.status === 409) {\n const afterRace = await findByName();\n if (afterRace) return afterRace;\n }\n throw err;\n }\n}\n\nasync function patchContent(ctx: ToolContext, fileId: string, etag: string, content: string) {\n const { data } = await ctx.client.PATCH('/api/v1/files/{id}', {\n params: { path: { id: fileId }, header: { 'If-Match': etag } },\n body: { content },\n });\n return data!;\n}\n\nexport const createProject = defineTool({\n ...catalogMeta('create_project'),\n inputSchema: z.object({\n name: z.string().min(1).max(200).describe('Project name.'),\n description: z.string().max(2000).optional(),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.POST('/api/v1/projects', {\n body: { name: i.name, ...(i.description ? { description: i.description } : {}) },\n });\n return result(text(`Created project \"${data!.name}\" (${data!.id}).`), jsonText(data!));\n },\n});\n\nexport const saveFile = defineTool({\n ...catalogMeta('save_file'),\n inputSchema: z.object({\n project_id: z.string().uuid().describe('Target project id.'),\n name: z.string().min(1).max(200),\n content: z.string().describe('Markdown body.'),\n folder_id: z.string().uuid().optional(),\n idempotencyKey: z.string().optional(),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.POST('/api/v1/files', {\n ...(i.idempotencyKey ? { params: { header: { 'Idempotency-Key': i.idempotencyKey } } } : {}),\n body: {\n project_id: i.project_id,\n name: i.name,\n content: i.content,\n ...(i.folder_id ? { folder_id: i.folder_id } : {}),\n },\n });\n return result(\n text(`Saved file \"${data!.name}\" (${data!.id}). 1 credit charged.`),\n jsonText(data!),\n );\n },\n});\n\nexport const updateFile = defineTool({\n ...catalogMeta('update_file'),\n inputSchema: z.object({\n id: z.string().uuid(),\n content: z.string().optional(),\n name: z.string().min(1).max(200).optional(),\n folder_id: z.string().uuid().nullable().optional(),\n archived: z.boolean().optional(),\n ifMatch: z\n .string()\n .optional()\n .describe('ETag/version for safe content writes (required when changing content).'),\n }),\n handler: async (i, ctx) => {\n const { data } = await ctx.client.PATCH('/api/v1/files/{id}', {\n params: {\n path: { id: i.id },\n ...(i.ifMatch ? { header: { 'If-Match': i.ifMatch } } : {}),\n },\n body: {\n ...(i.content != null ? { content: i.content } : {}),\n ...(i.name != null ? { name: i.name } : {}),\n ...(i.folder_id !== undefined ? { folder_id: i.folder_id } : {}),\n ...(i.archived != null ? { archived: i.archived } : {}),\n },\n });\n return result(text(`Updated file \"${data!.name}\" (v${data!.version}).`), jsonText(data!));\n },\n});\n\nexport const saveDocument = defineTool({\n ...catalogMeta('save_document'),\n inputSchema: z.object({\n content: z.string().min(1).describe('Markdown body to save.'),\n name: z\n .string()\n .max(200)\n .optional()\n .describe('Document name. Defaults to the first H1, else \"Untitled\".'),\n project: z\n .string()\n .optional()\n .describe('Project id, or a name to find-or-create. Defaults to \"Drafts\".'),\n idempotencyKey: z.string().optional(),\n }),\n handler: async (i, ctx) => {\n const name = i.name?.trim() || deriveName(i.content);\n const project = await resolveProject(ctx, i.project);\n\n const { data: full } = await ctx.client.GET('/api/v1/projects/{id}', {\n params: { path: { id: project.id }, query: {} },\n });\n const files = (full!.files ?? []) as FileLike[];\n const existing = files.find((f) => f.name === name && !f.archived);\n\n let file: FileLike;\n let created: boolean;\n if (existing) {\n try {\n file = (await patchContent(ctx, existing.id, existing.etag, i.content)) as FileLike;\n } catch (err) {\n if (err instanceof MdtidyApiError && err.status === 409) {\n // Stale ETag — re-read and retry once.\n const { data: fresh } = await ctx.client.GET('/api/v1/projects/{id}', {\n params: { path: { id: project.id }, query: {} },\n });\n const again = ((fresh!.files ?? []) as FileLike[]).find(\n (f) => f.name === name && !f.archived,\n );\n if (!again) throw err;\n file = (await patchContent(ctx, again.id, again.etag, i.content)) as FileLike;\n } else {\n throw err;\n }\n }\n created = false;\n } else {\n const { data } = await ctx.client.POST('/api/v1/files', {\n ...(i.idempotencyKey\n ? { params: { header: { 'Idempotency-Key': i.idempotencyKey } } }\n : {}),\n body: { project_id: project.id, name, content: i.content },\n });\n file = data! as FileLike;\n created = true;\n }\n\n const url = `${ctx.baseUrl}/edit/${file.id}`;\n const summary = created\n ? `Created \"${name}\" in project \"${project.name}\". 1 credit charged.`\n : `Updated \"${name}\" in project \"${project.name}\". No credit (update).`;\n return result(\n text(summary),\n jsonText({\n file_id: file.id,\n name,\n project,\n version: file.version,\n etag: file.etag,\n url,\n created,\n creditsRemaining: file.credits_remaining ?? null,\n }),\n );\n },\n});\n","import { checkUsage, getEntitlement, getFile, getProject, listProjects } from './tools/read';\nimport { getProjectShare, shareProjectPublic } from './tools/share';\nimport { tidyMarkdown } from './tools/tidy-markdown';\nimport { createProject, saveDocument, saveFile, updateFile } from './tools/write';\nimport type { ToolDef } from './types';\n\n// The v1 curated tool surface (spec §3.4). Order = how they appear in\n// `tools/list`: the flagship convert first, then read, write (save_document\n// leads the write group as the fast path), then share.\nexport const REGISTRY: ToolDef[] = [\n tidyMarkdown,\n checkUsage,\n getEntitlement,\n listProjects,\n getProject,\n getFile,\n createProject,\n saveDocument,\n saveFile,\n updateFile,\n getProjectShare,\n shareProjectPublic,\n];\n\nexport function getTool(name: string): ToolDef | undefined {\n return REGISTRY.find((t) => t.name === name);\n}\n","import { REGISTRY, type ToolContext, type ToolDef } from '@mdtidy/tools';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\n// Attach every registry tool to an MCP SDK server (the stdio path). Both\n// transports consume the same REGISTRY; this is the SDK projection. Spec §3.3.\nexport function registerTools(\n server: McpServer,\n ctx: ToolContext,\n tools: ToolDef[] = REGISTRY,\n): void {\n for (const tool of tools) {\n server.registerTool(\n tool.name,\n {\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema.shape,\n },\n async (args: unknown) => {\n const res = await tool.handler(args as Record<string, unknown>, ctx);\n return { content: res.content as never, isError: res.isError };\n },\n );\n }\n}\n","// Identity advertised to MCP clients. `version` is the published @mdtidy/mcp\n// version; bumped by changesets at release.\nexport const SERVER_INFO = {\n name: 'mdtidy',\n // Advertised base version (MAJOR.MINOR). The published npm patch is the CI\n // run number; this is informational for MCP clients.\n version: '1.1.0',\n title: 'Markdown Tidy',\n};\n\n/** MCP protocol version this server speaks (echoes the client's request when valid). */\nexport const PROTOCOL_VERSION = '2025-06-18';\n","// Stateless JSON-RPC 2.0 dispatch for the Streamable-HTTP path (the Vercel\n// /mcp route). Both transports share the same REGISTRY; this is the HTTP\n// projection — no SDK server object, no session state. Spec §3.3, §4.1.\n\nimport { REGISTRY, type ToolContext, type ToolDef } from '@mdtidy/tools';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\n\nimport { PROTOCOL_VERSION, SERVER_INFO } from './server-info';\n\nexport interface JsonRpcRequest {\n jsonrpc: '2.0';\n id?: string | number | null;\n method: string;\n params?: Record<string, unknown>;\n}\n\nexport interface JsonRpcResponse {\n jsonrpc: '2.0';\n id: string | number | null;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport interface DispatchOptions {\n tools?: ToolDef[];\n}\n\nfunction toolInputJsonSchema(tool: ToolDef): Record<string, unknown> {\n const schema = zodToJsonSchema(tool.inputSchema, {\n target: 'jsonSchema7',\n $refStrategy: 'none',\n }) as Record<string, unknown>;\n delete schema.$schema;\n return schema;\n}\n\nexport async function handleJsonRpc(\n req: JsonRpcRequest,\n ctx: ToolContext,\n opts: DispatchOptions = {},\n): Promise<JsonRpcResponse | null> {\n const tools = opts.tools ?? REGISTRY;\n const id = req.id ?? null;\n const ok = (result: unknown): JsonRpcResponse => ({ jsonrpc: '2.0', id, result });\n const fail = (code: number, message: string): JsonRpcResponse => ({\n jsonrpc: '2.0',\n id,\n error: { code, message },\n });\n\n switch (req.method) {\n case 'initialize': {\n const requested = req.params?.protocolVersion;\n return ok({\n protocolVersion: typeof requested === 'string' ? requested : PROTOCOL_VERSION,\n capabilities: { tools: { listChanged: false } },\n serverInfo: SERVER_INFO,\n });\n }\n case 'ping':\n return ok({});\n case 'tools/list':\n return ok({\n tools: tools.map((t) => ({\n name: t.name,\n title: t.title,\n description: t.description,\n inputSchema: toolInputJsonSchema(t),\n })),\n });\n case 'tools/call': {\n const name = req.params?.name as string | undefined;\n const tool = tools.find((t) => t.name === name);\n if (!tool) return fail(-32602, `Unknown tool: ${name}`);\n const parsed = tool.inputSchema.safeParse(req.params?.arguments ?? {});\n if (!parsed.success) {\n const detail = parsed.error.issues\n .map((iss) => `${iss.path.join('.')}: ${iss.message}`)\n .join('; ');\n return fail(-32602, `Invalid arguments for ${name}: ${detail}`);\n }\n try {\n const res = await tool.handler(parsed.data, ctx);\n return ok({ content: res.content, isError: res.isError ?? false });\n } catch (err) {\n // Per MCP, tool execution failures are returned as an error *result*\n // (isError), not a JSON-RPC protocol error, so the model can react.\n // Surface the underlying `cause` (undici wraps network failures as a\n // terse \"fetch failed\" — the cause carries the real reason: ENOTFOUND,\n // ECONNREFUSED, cert errors, …) to the result AND the server log.\n const e = err instanceof Error ? err : new Error(String(err));\n const cause = (e as { cause?: { code?: unknown; message?: unknown } }).cause;\n const causeStr = cause ? ` (cause: ${String(cause.code ?? cause.message ?? cause)})` : '';\n console.error(`[mdtidy-mcp] tool \"${name}\" failed: ${e.message}${causeStr}`);\n return ok({\n content: [{ type: 'text', text: `Error: ${e.message}${causeStr}` }],\n isError: true,\n });\n }\n }\n default:\n // Notifications (no id) need no response.\n if (req.id === undefined || req.method.startsWith('notifications/')) return null;\n return fail(-32601, `Method not found: ${req.method}`);\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { buildContext } from './context';\nimport { registerTools } from './register';\nimport { SERVER_INFO } from './server-info';\n\nexport interface StdioOptions {\n /** Defaults to process.env.MDTIDY_API_KEY. */\n apiKey?: string;\n /** Defaults to process.env.MDTIDY_BASE_URL ?? https://mdtidy.com. */\n baseUrl?: string;\n}\n\n/** Boot the stdio MCP server (the `npx @mdtidy/mcp` / local-client path). */\nexport async function startStdio(opts: StdioOptions = {}): Promise<void> {\n const apiKey = opts.apiKey ?? process.env.MDTIDY_API_KEY;\n if (!apiKey) {\n throw new Error(\n 'MDTIDY_API_KEY is required. Create a key at https://mdtidy.com/account/api-keys and set it in your MCP client config.',\n );\n }\n const baseUrl = opts.baseUrl ?? process.env.MDTIDY_BASE_URL ?? 'https://www.mdtidy.com';\n const ctx = buildContext({ apiKey, baseUrl, transport: 'stdio' });\n\n const server = new McpServer(\n { name: SERVER_INFO.name, version: SERVER_INFO.version },\n { capabilities: { tools: {} } },\n );\n registerTools(server, ctx);\n\n await server.connect(new StdioServerTransport());\n}\n","// Web-standard, stateless Streamable-HTTP handler for the mdtidy /mcp route.\n// Reads the API key from the request, forwards it to /api/v1/*, and dispatches\n// JSON-RPC against the shared registry. No session state — ideal for Vercel's\n// ephemeral functions. Spec §4.1.\n\nimport { buildContext } from './context';\nimport { handleJsonRpc, type JsonRpcRequest } from './jsonrpc';\n\nexport interface McpRouteHandlerOptions {\n /** Resolve the API origin per request (e.g. the request's own origin for loopback). */\n resolveBaseUrl?: (req: Request) => string;\n /** Fallback API origin. Defaults to https://mdtidy.com. */\n defaultBaseUrl?: string;\n /** Injectable fetch (tests / custom transport). */\n fetch?: typeof fetch;\n}\n\nexport type McpRouteHandler = (req: Request) => Promise<Response>;\n\nfunction json(body: unknown, status: number): Response {\n return new Response(JSON.stringify(body), {\n status,\n headers: { 'content-type': 'application/json' },\n });\n}\n\nfunction extractApiKey(req: Request): string | undefined {\n const auth = req.headers.get('authorization');\n if (auth && auth.toLowerCase().startsWith('bearer ')) return auth.slice(7).trim();\n const xKey = req.headers.get('x-api-key');\n return xKey?.trim() || undefined;\n}\n\nexport function createMcpRouteHandler(options: McpRouteHandlerOptions = {}): McpRouteHandler {\n return async function handler(req: Request): Promise<Response> {\n // Stateless v1: GET (SSE stream) / DELETE (session teardown) are not used.\n if (req.method === 'GET' || req.method === 'DELETE') {\n return json(\n {\n jsonrpc: '2.0',\n id: null,\n error: { code: -32000, message: 'This MCP server is stateless; use POST.' },\n },\n 405,\n );\n }\n if (req.method !== 'POST') return new Response('Method Not Allowed', { status: 405 });\n\n const apiKey = extractApiKey(req);\n if (!apiKey) {\n return json(\n {\n jsonrpc: '2.0',\n id: null,\n error: {\n code: -32001,\n message:\n 'Missing API key. Send \"Authorization: Bearer <mdtidy key>\" or \"X-API-KEY\". Create one at https://mdtidy.com/account/api-keys.',\n },\n },\n 401,\n );\n }\n\n let body: unknown;\n try {\n body = await req.json();\n } catch {\n return json(\n { jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } },\n 400,\n );\n }\n\n const baseUrl = options.resolveBaseUrl?.(req) ?? options.defaultBaseUrl ?? 'https://mdtidy.com';\n const ctx = buildContext({ apiKey, baseUrl, transport: 'http', fetch: options.fetch });\n\n if (Array.isArray(body)) {\n const responses = (\n await Promise.all(body.map((m) => handleJsonRpc(m as JsonRpcRequest, ctx)))\n ).filter((r) => r !== null);\n return json(responses, 200);\n }\n\n const res = await handleJsonRpc(body as JsonRpcRequest, ctx);\n if (res === null) return new Response(null, { status: 202 });\n return json(res, 200);\n };\n}\n"],"mappings":"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","names":["Request","result","error","final","joiner","input","input","z","z","z","z","z","z","result"]}
|