@mdtidy/mcp 1.0.0 → 1.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  startStdio
4
- } from "./chunk-TABPKZQW.js";
4
+ } from "./chunk-KFLDIOPG.js";
5
5
 
6
6
  // src/bin.ts
7
7
  startStdio().catch((err) => {
@@ -1051,7 +1051,9 @@ function registerTools(server, ctx, tools = REGISTRY) {
1051
1051
  // ../../packages/mcp-core/src/server-info.ts
1052
1052
  var SERVER_INFO = {
1053
1053
  name: "mdtidy",
1054
- version: "1.0.0",
1054
+ // Advertised base version (MAJOR.MINOR). The published npm patch is the CI
1055
+ // run number; this is informational for MCP clients.
1056
+ version: "1.1.0",
1055
1057
  title: "Markdown Tidy"
1056
1058
  };
1057
1059
  var PROTOCOL_VERSION = "2025-06-18";
@@ -1213,4 +1215,4 @@ export {
1213
1215
  startStdio,
1214
1216
  createMcpRouteHandler
1215
1217
  };
1216
- //# sourceMappingURL=chunk-TABPKZQW.js.map
1218
+ //# sourceMappingURL=chunk-KFLDIOPG.js.map
@@ -1 +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/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\nexport const DEFAULT_BASE_URL = 'https://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://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 (input, init) => {\n if (init?.signal) return baseFetch(input, init);\n return baseFetch(input, { ...init, signal: AbortSignal.timeout(timeoutMs) });\n };\n}\n\nfunction authMiddleware(apiKey: string): Middleware {\n return {\n onRequest({ request }) {\n request.headers.set('X-API-KEY', apiKey);\n request.headers.set('Authorization', `Bearer ${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 version: '1.0.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 const message = err instanceof Error ? err.message : String(err);\n return ok({ content: [{ type: 'text', text: `Error: ${message}` }], isError: true });\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://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":["result","error","final","joiner","input","input","z","z","z","z","z","z","result"]}
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\nexport const DEFAULT_BASE_URL = 'https://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://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 (input, init) => {\n if (init?.signal) return baseFetch(input, init);\n return baseFetch(input, { ...init, signal: AbortSignal.timeout(timeoutMs) });\n };\n}\n\nfunction authMiddleware(apiKey: string): Middleware {\n return {\n onRequest({ request }) {\n request.headers.set('X-API-KEY', apiKey);\n request.headers.set('Authorization', `Bearer ${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 const message = err instanceof Error ? err.message : String(err);\n return ok({ content: [{ type: 'text', text: `Error: ${message}` }], isError: true });\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://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":["result","error","final","joiner","input","input","z","z","z","z","z","z","result"]}
package/dist/http.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createMcpRouteHandler
3
- } from "./chunk-TABPKZQW.js";
3
+ } from "./chunk-KFLDIOPG.js";
4
4
  export {
5
5
  createMcpRouteHandler
6
6
  };
package/dist/index.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  handleJsonRpc,
12
12
  registerTools,
13
13
  startStdio
14
- } from "./chunk-TABPKZQW.js";
14
+ } from "./chunk-KFLDIOPG.js";
15
15
  export {
16
16
  DEFERRED_TOOLS,
17
17
  MdtidyApiError,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mdtidy/mcp",
3
- "version": "1.0.0",
3
+ "version": "1.1.3",
4
4
  "description": "Model Context Protocol server for Markdown Tidy (mdtidy.com) — tidy, convert, save, and share Markdown from any AI agent.",
5
5
  "license": "MIT",
6
6
  "type": "module",