@myna-sh/mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/mcp.mjs +7 -0
- package/dist/main.d.ts +21 -0
- package/dist/main.js +1118 -0
- package/dist/main.js.map +1 -0
- package/package.json +41 -0
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/main.ts","../src/server.ts","../src/config.ts","../../sdk/src/errors.ts","../../sdk/src/http.ts","../../sdk/src/management.ts","../../sdk/src/codegen.ts","../src/tools.ts","../src/resources.ts","../src/http.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { createServer } from \"./server.js\";\nimport { runHttp } from \"./http.js\";\n\n/** Run over stdio (default) or streamable HTTP (`--http`). */\nexport async function main(argv: string[] = process.argv.slice(2)): Promise<void> {\n const useHttp = argv.includes(\"--http\") || process.env.MYNA_MCP_TRANSPORT === \"http\";\n\n if (useHttp) {\n const port = Number(process.env.MYNA_MCP_PORT ?? process.env.PORT ?? 3333);\n const authToken = process.env.MYNA_MCP_TOKEN ?? process.env.MYNA_TOKEN;\n await runHttp({ port, authToken });\n return;\n }\n\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n // Keep the process alive; the transport closes on stdin end.\n process.stderr.write(\"myna-mcp: stdio transport ready\\n\");\n}\n\nexport { createServer } from \"./server.js\";\nexport { runHttp } from \"./http.js\";\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { registerTools } from \"./tools.js\";\nimport { registerResources } from \"./resources.js\";\n\nexport const SERVER_NAME = \"myna\";\nexport const SERVER_VERSION = \"0.1.0\";\n\n/** Build a fully-wired Myna MCP server (tools + resources). */\nexport function createServer(): McpServer {\n return createServerForRegistry(new ProjectRegistry());\n}\n\n/** Internal variant used by the stateless HTTP transport. */\nexport function createServerForRegistry(registry: ProjectRegistry): McpServer {\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n {\n capabilities: { tools: {}, resources: {} },\n instructions:\n \"Myna MCP server: manage content, schemas, assets, change sets, and previews. \" +\n \"The primary flow is: create a change set, apply entry/asset operations, validate, \" +\n \"then create one preview URL. Publishing is a separate, confirmation-gated action.\",\n },\n );\n registerTools(server, registry);\n registerResources(server, registry);\n return server;\n}\n","import { readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { createManagementClient, type ManagementClient } from \"@myna-sh/sdk/management\";\n\n/**\n * Named project configurations (SPEC 13). A default project plus per-call\n * overrides. Configuration comes from the environment and an optional JSON file\n * (`MYNA_MCP_CONFIG` or `~/.config/myna/mcp.json`).\n */\n\nexport interface NamedProject {\n project: string;\n organization?: string;\n apiUrl?: string;\n token?: string;\n}\n\nexport interface McpConfigFile {\n default?: string;\n apiUrl?: string;\n token?: string;\n projects?: Record<string, NamedProject>;\n}\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport class ProjectRegistry {\n private readonly file: McpConfigFile;\n private readonly clients = new Map<string, ManagementClient>();\n\n constructor(private readonly env: NodeJS.ProcessEnv = process.env) {\n this.file = loadConfigFile(env);\n }\n\n private get defaultApiUrl(): string {\n return this.env.MYNA_API_URL ?? this.file.apiUrl ?? DEFAULT_API_URL;\n }\n\n private get defaultToken(): string | undefined {\n return this.env.MYNA_TOKEN ?? this.file.token;\n }\n\n /** The named-project key used when a call omits `project`. */\n defaultProjectName(): string | undefined {\n return this.file.default ?? (this.env.MYNA_PROJECT ? \"__env\" : undefined);\n }\n\n /** All configured named projects (env default included). */\n list(): Array<{ name: string; project: string; organization?: string }> {\n const out: Array<{ name: string; project: string; organization?: string }> = [];\n if (this.env.MYNA_PROJECT) {\n out.push({ name: \"__env\", project: this.env.MYNA_PROJECT, organization: this.env.MYNA_ORGANIZATION });\n }\n for (const [name, cfg] of Object.entries(this.file.projects ?? {})) {\n out.push({ name, project: cfg.project, organization: cfg.organization });\n }\n return out;\n }\n\n /** Resolve a project reference: an explicit id/slug, a named config, or the default. */\n resolve(ref?: string): { project: string; organization?: string; apiUrl: string; token: string | undefined } {\n // A named configuration.\n if (ref && this.file.projects?.[ref]) {\n const cfg = this.file.projects[ref]!;\n return {\n project: cfg.project,\n organization: cfg.organization,\n apiUrl: cfg.apiUrl ?? this.defaultApiUrl,\n token: cfg.token ?? this.defaultToken,\n };\n }\n // The env default named project.\n if ((!ref || ref === \"__env\") && this.env.MYNA_PROJECT) {\n return {\n project: ref && ref !== \"__env\" ? ref : this.env.MYNA_PROJECT,\n organization: this.env.MYNA_ORGANIZATION,\n apiUrl: this.defaultApiUrl,\n token: this.defaultToken,\n };\n }\n // A raw project id/slug, or a default named config.\n if (!ref && this.file.default && this.file.projects?.[this.file.default]) {\n return this.resolve(this.file.default);\n }\n if (!ref) {\n throw new Error(\"No project specified and no default is configured (set MYNA_PROJECT or configure a default).\");\n }\n return { project: ref, organization: this.env.MYNA_ORGANIZATION, apiUrl: this.defaultApiUrl, token: this.defaultToken };\n }\n\n /** A management client bound to the resolved project's API + token. */\n clientFor(ref?: string): { client: ManagementClient; project: string; organization?: string } {\n const resolved = this.resolve(ref);\n if (!resolved.token) {\n throw new Error(\"No credential available. Set MYNA_TOKEN or configure a token for the project.\");\n }\n const cacheKey = `${resolved.apiUrl}::${resolved.token}`;\n let client = this.clients.get(cacheKey);\n if (!client) {\n client = createManagementClient({ token: resolved.token, apiUrl: resolved.apiUrl });\n this.clients.set(cacheKey, client);\n }\n return { client, project: resolved.project, organization: resolved.organization };\n }\n\n /** Resolve an organization for org-scoped calls. */\n organizationFor(ref?: string, organizationOverride?: string): string {\n const resolved = this.resolve(ref);\n const org = organizationOverride ?? resolved.organization;\n if (!org) throw new Error(\"No organization specified. Provide `organization` or configure one for the project.\");\n return org;\n }\n}\n\nfunction loadConfigFile(env: NodeJS.ProcessEnv): McpConfigFile {\n const explicit = env.MYNA_MCP_CONFIG;\n const candidates = [explicit, join(env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"myna\", \"mcp.json\")].filter(\n (v): v is string => Boolean(v),\n );\n for (const path of candidates) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as McpConfigFile;\n } catch {\n // Try next candidate.\n }\n }\n return {};\n}\n","import type { FieldErrorContract, ProblemDetailsContract } from \"../../api-contracts/src/common.js\";\n\n/**\n * Error thrown by both SDK clients when the API returns a non-2xx response.\n * Carries the parsed RFC 9457 problem-details document so callers can branch on\n * the stable `code`, inspect field-level `fields`, and surface the `requestId`.\n */\nexport class MynaApiError extends Error {\n /** HTTP status code. */\n readonly status: number;\n /** Stable machine-readable error code (e.g. `VALIDATION_FAILED`). */\n readonly code: string;\n /** RFC 9457 `type` URI. */\n readonly type: string | undefined;\n /** Human-facing title. */\n readonly title: string;\n /** Longer human-facing detail, when provided. */\n readonly detail: string | undefined;\n /** Server request id for support/correlation. */\n readonly requestId: string | undefined;\n /** Field-level validation errors, when present. */\n readonly fields: FieldErrorContract[] | undefined;\n /** The full parsed problem document (or a synthesized one). */\n readonly problem: ProblemDetailsContract;\n\n constructor(problem: ProblemDetailsContract) {\n super(problem.detail ?? problem.title ?? `Request failed (${problem.status})`);\n this.name = \"MynaApiError\";\n this.status = problem.status;\n this.code = problem.code;\n this.type = problem.type;\n this.title = problem.title;\n this.detail = problem.detail;\n this.requestId = problem.requestId;\n this.fields = problem.fields;\n this.problem = problem;\n Object.setPrototypeOf(this, MynaApiError.prototype);\n }\n\n static is(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n }\n}\n\n/** Type guard for `MynaApiError`. */\nexport function isMynaApiError(value: unknown): value is MynaApiError {\n return value instanceof MynaApiError;\n}\n\n/** Build a `MynaApiError` from an arbitrary response body and status. */\nexport function problemFromResponse(status: number, body: unknown, fallbackTitle: string): MynaApiError {\n if (body && typeof body === \"object\" && \"code\" in body && \"status\" in body) {\n return new MynaApiError(body as ProblemDetailsContract);\n }\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof (body as { error: unknown }).error === \"string\"\n ? (body as { error: string }).error\n : typeof body === \"string\" && body\n ? body\n : undefined;\n return new MynaApiError({\n type: \"about:blank\",\n title: fallbackTitle,\n status,\n code: status >= 500 ? \"INTERNAL\" : \"REQUEST_FAILED\",\n detail,\n } as ProblemDetailsContract);\n}\n","import { problemFromResponse } from \"./errors.js\";\n\n/** A fetch-compatible function. */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface RetryOptions {\n /** Maximum number of retries (in addition to the first attempt). Default 3. */\n maxRetries?: number;\n /** Base backoff in milliseconds (exponential). Default 200. */\n baseDelayMs?: number;\n /** Cap on any single backoff. Default 5000. */\n maxDelayMs?: number;\n}\n\nexport interface HttpClientOptions {\n /** Base URL including the version prefix, e.g. `https://api.myna.sh/v1`. */\n baseUrl: string;\n /** Bearer credential (API key, preview token, or CLI token). */\n token?: string | undefined;\n /** Custom fetch implementation (browser/undici/node). */\n fetch?: FetchLike | undefined;\n /** Extra default headers merged into every request. */\n headers?: Record<string, string> | undefined;\n /** Retry policy. Retries apply to safe reads and idempotent mutations only. */\n retry?: RetryOptions | undefined;\n}\n\nexport interface RequestOptions {\n query?: Record<string, unknown> | undefined;\n body?: unknown;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n /** Sending an idempotency key makes a mutation eligible for automatic retry. */\n idempotencyKey?: string | undefined;\n /** Override the bearer token for a single request (e.g. a preview token). */\n token?: string | undefined;\n}\n\nconst RETRYABLE_STATUS = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst SAFE_METHODS = new Set([\"GET\", \"HEAD\", \"OPTIONS\"]);\n\nfunction resolveFetch(custom?: FetchLike): FetchLike {\n if (custom) return custom;\n if (typeof globalThis.fetch === \"function\") return globalThis.fetch.bind(globalThis) as FetchLike;\n throw new Error(\"No fetch implementation available. Pass `fetch` to the Myna client.\");\n}\n\n/** Serialize a query object, supporting nested `filter[field][op]` shapes. */\nexport function buildQuery(query: Record<string, unknown> | undefined): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n const append = (key: string, value: unknown): void => {\n if (value === undefined || value === null) return;\n if (Array.isArray(value)) {\n params.set(key, value.join(\",\"));\n return;\n }\n if (typeof value === \"object\") {\n for (const [op, v] of Object.entries(value as Record<string, unknown>)) {\n append(`${key}[${op}]`, v);\n }\n return;\n }\n params.set(key, String(value));\n };\n for (const [key, value] of Object.entries(query)) append(key, value);\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error(\"Aborted\"));\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new Error(\"Aborted\"));\n },\n { once: true },\n );\n });\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly token: string | undefined;\n private readonly fetchImpl: FetchLike;\n private readonly defaultHeaders: Record<string, string>;\n private readonly retry: Required<RetryOptions>;\n\n constructor(options: HttpClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n this.token = options.token;\n this.fetchImpl = resolveFetch(options.fetch);\n this.defaultHeaders = options.headers ?? {};\n this.retry = {\n maxRetries: options.retry?.maxRetries ?? 3,\n baseDelayMs: options.retry?.baseDelayMs ?? 200,\n maxDelayMs: options.retry?.maxDelayMs ?? 5000,\n };\n }\n\n /** Perform a request and unwrap the `{ data }` envelope. */\n async request<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n if (raw.status === 204 || raw.status === 304) return undefined as T;\n const parsed = (await raw.json().catch(() => undefined)) as { data?: T } | undefined;\n return (parsed && \"data\" in parsed ? parsed.data : (parsed as unknown)) as T;\n }\n\n /** Perform a request and return the full parsed body (envelope included). */\n async requestEnvelope<T>(method: string, path: string, options: RequestOptions = {}): Promise<T> {\n const raw = await this.requestRaw(method, path, options);\n return (await raw.json().catch(() => ({}))) as T;\n }\n\n /** Low-level request with retries; throws `MynaApiError` on non-2xx. */\n async requestRaw(method: string, path: string, options: RequestOptions = {}): Promise<Response> {\n const url = `${this.baseUrl}${path}${buildQuery(options.query)}`;\n const headers: Record<string, string> = {\n accept: \"application/json\",\n ...this.defaultHeaders,\n ...options.headers,\n };\n const token = options.token ?? this.token;\n if (token) headers.authorization = `Bearer ${token}`;\n\n let payload: BodyInit | undefined;\n if (options.body !== undefined) {\n if (options.body instanceof Uint8Array || typeof options.body === \"string\") {\n payload = options.body as BodyInit;\n } else {\n headers[\"content-type\"] = \"application/json\";\n payload = JSON.stringify(options.body);\n }\n }\n if (options.idempotencyKey) headers[\"idempotency-key\"] = options.idempotencyKey;\n\n const idempotent = SAFE_METHODS.has(method.toUpperCase()) || Boolean(options.idempotencyKey);\n const init: RequestInit = { method, headers };\n if (payload !== undefined) init.body = payload;\n if (options.signal) init.signal = options.signal;\n\n let attempt = 0;\n for (;;) {\n let response: Response;\n try {\n response = await this.fetchImpl(url, init);\n } catch (error) {\n if (idempotent && attempt < this.retry.maxRetries && !isAbort(error)) {\n await sleep(this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n throw error;\n }\n\n if (response.ok) return response;\n\n if (idempotent && RETRYABLE_STATUS.has(response.status) && attempt < this.retry.maxRetries) {\n const retryAfter = retryAfterMs(response);\n await sleep(retryAfter ?? this.backoff(attempt), options.signal);\n attempt++;\n continue;\n }\n\n const body = await response.json().catch(() => undefined);\n throw problemFromResponse(response.status, body, response.statusText || \"Request failed\");\n }\n }\n\n private backoff(attempt: number): number {\n const base = Math.min(this.retry.baseDelayMs * 2 ** attempt, this.retry.maxDelayMs);\n return Math.round(base * (0.5 + Math.random() * 0.5));\n }\n}\n\nfunction retryAfterMs(response: Response): number | undefined {\n const header = response.headers.get(\"retry-after\");\n if (!header) return undefined;\n const seconds = Number(header);\n return Number.isFinite(seconds) ? seconds * 1000 : undefined;\n}\n\nfunction isAbort(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n );\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type {\n AcceptInvitationResponse,\n ApiKeyContract,\n CreateApiKeyRequest,\n CreateApiKeyResponse,\n CreateInvitationRequest,\n CreateOrganizationRequest,\n InvitationContract,\n MemberContract,\n OrganizationContract,\n UpdateMemberRequest,\n UpdateOrganizationRequest,\n} from \"../../api-contracts/src/organizations.js\";\nimport type { ActivityEventContract } from \"../../api-contracts/src/activity.js\";\nimport type {\n AssetContract,\n CompleteUploadResponse,\n CreateUploadRequest,\n CreateUploadResponse,\n UpdateAssetRequest,\n} from \"../../api-contracts/src/assets.js\";\nimport type {\n BillingResponse,\n CheckoutRequest,\n CheckoutResponse,\n PortalResponse,\n} from \"../../api-contracts/src/billing.js\";\nimport type {\n ChangeSetContract,\n CreateChangeSetRequest,\n UpdateChangeSetRequest,\n} from \"../../api-contracts/src/change-sets.js\";\nimport type {\n CollectionContract,\n CollectionVersionContract,\n SchemaDiffResponse,\n SchemaPushResponse,\n} from \"../../api-contracts/src/collections.js\";\nimport type {\n EntryContract,\n RestoreRevisionResponse,\n RevisionContract,\n} from \"../../api-contracts/src/entries.js\";\nimport type { CreatePreviewRequest, PreviewContract } from \"../../api-contracts/src/previews.js\";\nimport type {\n CreateProjectRequest,\n ProjectContract,\n UpdateProjectRequest,\n} from \"../../api-contracts/src/projects.js\";\nimport type { UsageResponse } from \"../../api-contracts/src/usage.js\";\nimport type {\n CreateWebhookRequest,\n CreateWebhookResponse,\n UpdateWebhookRequest,\n WebhookDeliveryContract,\n WebhookEndpointContract,\n} from \"../../api-contracts/src/webhooks.js\";\nimport { HttpClient, type FetchLike, type RetryOptions } from \"./http.js\";\n\nconst DEFAULT_API_URL = \"https://api.myna.sh\";\n\nexport interface ManagementClientOptions {\n /** Management/CLI credential (`myna_sk_...`). */\n token: string;\n /** API origin. Defaults to `https://api.myna.sh`. */\n apiUrl?: string;\n fetch?: FetchLike;\n retry?: RetryOptions;\n /**\n * Idempotency-key factory for mutations. Defaults to a random UUID per call.\n * Pass a stable value to make a specific mutation replay-safe.\n */\n idempotencyKey?: () => string;\n}\n\nexport interface ListOptions {\n limit?: number;\n cursor?: string;\n signal?: AbortSignal;\n}\n\nexport interface Page<T> {\n data: T[];\n nextCursor: string | null;\n}\n\nexport interface UploadAssetMeta {\n filename?: string;\n contentType?: string;\n /** Override the automatically detected byte length. */\n byteSize?: number;\n}\n\n/** Bytes or a filesystem path accepted by `uploadAsset`. */\nexport type AssetInput = string | Uint8Array | ArrayBuffer;\n\n/**\n * Server-only management client (SPEC 12). Typed wrappers over the full\n * management API surface. Mutations automatically carry an `Idempotency-Key`.\n */\nexport class ManagementClient {\n private readonly http: HttpClient;\n private readonly newIdempotencyKey: () => string;\n private readonly fetchImpl: FetchLike;\n\n constructor(options: ManagementClientOptions) {\n if (!options.token) throw new Error(\"createManagementClient: `token` is required.\");\n this.newIdempotencyKey = options.idempotencyKey ?? (() => randomUUID());\n this.fetchImpl = options.fetch ?? ((input, init) => fetch(input, init));\n this.http = new HttpClient({\n baseUrl: `${(options.apiUrl ?? DEFAULT_API_URL).replace(/\\/+$/, \"\")}/v1`,\n token: options.token,\n fetch: options.fetch,\n retry: options.retry,\n });\n }\n\n // Convenience: idempotency key for a mutation.\n private idem(): string {\n return this.newIdempotencyKey();\n }\n\n private get<T>(path: string, query?: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\n return this.http.request<T>(\"GET\", path, { query, signal });\n }\n\n private async page<T>(path: string, opts: ListOptions = {}): Promise<Page<T>> {\n const body = await this.http.requestEnvelope<{ data: T[]; pagination: { nextCursor: string | null } }>(\n \"GET\",\n path,\n { query: { limit: opts.limit, cursor: opts.cursor }, signal: opts.signal },\n );\n return { data: body.data, nextCursor: body.pagination?.nextCursor ?? null };\n }\n\n private mutate<T>(method: string, path: string, body?: unknown, query?: Record<string, unknown>): Promise<T> {\n return this.http.request<T>(method, path, { body, query, idempotencyKey: this.idem() });\n }\n\n // --- Organizations --------------------------------------------------------\n readonly organizations = {\n list: (signal?: AbortSignal): Promise<OrganizationContract[]> =>\n this.get<OrganizationContract[]>(\"/organizations\", undefined, signal),\n create: (body: CreateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"POST\", \"/organizations\", body),\n get: (organization: string, signal?: AbortSignal): Promise<OrganizationContract> =>\n this.get<OrganizationContract>(`/organizations/${enc(organization)}`, undefined, signal),\n update: (organization: string, body: UpdateOrganizationRequest): Promise<OrganizationContract> =>\n this.mutate<OrganizationContract>(\"PATCH\", `/organizations/${enc(organization)}`, body),\n delete: (organization: string): Promise<{ ok: boolean; recoverableForDays: number }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}`),\n export: (organization: string): Promise<{ jobId: string; storageKey: string; downloadUrl: string; ready: boolean }> =>\n this.mutate(\"POST\", `/organizations/${enc(organization)}/export`),\n usage: (organization: string, signal?: AbortSignal): Promise<UsageResponse> =>\n this.get<UsageResponse>(`/organizations/${enc(organization)}/usage`, undefined, signal),\n };\n\n // --- Members & invitations ------------------------------------------------\n readonly members = {\n list: (organization: string, signal?: AbortSignal): Promise<MemberContract[]> =>\n this.get<MemberContract[]>(`/organizations/${enc(organization)}/members`, undefined, signal),\n update: (organization: string, user: string, body: UpdateMemberRequest): Promise<{ ok: boolean }> =>\n this.mutate(\"PATCH\", `/organizations/${enc(organization)}/members/${enc(user)}`, body),\n remove: (organization: string, user: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/members/${enc(user)}`),\n };\n\n readonly invitations = {\n list: (organization: string, signal?: AbortSignal): Promise<InvitationContract[]> =>\n this.get<InvitationContract[]>(`/organizations/${enc(organization)}/invitations`, undefined, signal),\n create: (organization: string, body: CreateInvitationRequest): Promise<InvitationContract> =>\n this.mutate<InvitationContract>(\"POST\", `/organizations/${enc(organization)}/invitations`, body),\n revoke: (organization: string, invitation: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/invitations/${enc(invitation)}`),\n accept: (token: string): Promise<AcceptInvitationResponse> =>\n this.mutate<AcceptInvitationResponse>(\"POST\", `/invitations/${enc(token)}/accept`),\n };\n\n // --- Projects -------------------------------------------------------------\n readonly projects = {\n list: (organization: string, signal?: AbortSignal): Promise<ProjectContract[]> =>\n this.get<ProjectContract[]>(`/organizations/${enc(organization)}/projects`, undefined, signal),\n create: (organization: string, body: CreateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/organizations/${enc(organization)}/projects`, body),\n get: (project: string, signal?: AbortSignal): Promise<ProjectContract> =>\n this.get<ProjectContract>(`/projects/${enc(project)}`, undefined, signal),\n update: (project: string, body: UpdateProjectRequest): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"PATCH\", `/projects/${enc(project)}`, body),\n archive: (project: string): Promise<ProjectContract> =>\n this.mutate<ProjectContract>(\"POST\", `/projects/${enc(project)}/archive`),\n };\n\n // --- Schema ---------------------------------------------------------------\n readonly schema = {\n collections: (project: string, signal?: AbortSignal): Promise<CollectionContract[]> =>\n this.get<CollectionContract[]>(`/projects/${enc(project)}/collections`, undefined, signal),\n collection: (project: string, key: string, signal?: AbortSignal): Promise<CollectionContract> =>\n this.get<CollectionContract>(`/projects/${enc(project)}/collections/${enc(key)}`, undefined, signal),\n versions: (project: string, key: string, signal?: AbortSignal): Promise<CollectionVersionContract[]> =>\n this.get<CollectionVersionContract[]>(`/projects/${enc(project)}/collections/${enc(key)}/versions`, undefined, signal),\n diff: (project: string, collections: Record<string, unknown>[]): Promise<SchemaDiffResponse> =>\n this.mutate<SchemaDiffResponse>(\"POST\", `/projects/${enc(project)}/schema/diff`, { collections }),\n push: (\n project: string,\n collections: Record<string, unknown>[],\n opts: { allowDestructive?: boolean; changeSummary?: string } = {},\n ): Promise<SchemaPushResponse> =>\n this.mutate<SchemaPushResponse>(\"POST\", `/projects/${enc(project)}/schema/push`, {\n collections,\n allowDestructive: opts.allowDestructive ?? false,\n changeSummary: opts.changeSummary,\n }),\n };\n\n // --- Entries & revisions --------------------------------------------------\n readonly entries = {\n list: (\n project: string,\n opts: ListOptions & { collection?: string; status?: string } = {},\n ): Promise<Page<EntryContract>> =>\n this.page<EntryContract>(\n `/projects/${enc(project)}/entries` + query({ collection: opts.collection, status: opts.status }),\n opts,\n ),\n create: (\n project: string,\n body: { collection: string; slug?: string; data: Record<string, unknown>; changeSetId?: string; changeSummary?: string },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"POST\", `/projects/${enc(project)}/entries`, body),\n get: (project: string, entry: string, signal?: AbortSignal): Promise<EntryContract> =>\n this.get<EntryContract>(`/projects/${enc(project)}/entries/${enc(entry)}`, undefined, signal),\n update: (\n project: string,\n entry: string,\n body: {\n data?: Record<string, unknown>;\n slug?: string;\n expectedRevisionId?: string;\n changeSetId?: string;\n changeSummary?: string;\n },\n ): Promise<EntryContract> => this.mutate<EntryContract>(\"PATCH\", `/projects/${enc(project)}/entries/${enc(entry)}`, body),\n delete: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/entries/${enc(entry)}`, undefined, { changeSetId }),\n unpublish: (project: string, entry: string, changeSetId?: string): Promise<{ changeSetId: string; staged: string }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/unpublish`, undefined, { changeSetId }),\n restore: (project: string, entry: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\"POST\", `/projects/${enc(project)}/entries/${enc(entry)}/restore`),\n revisions: (project: string, entry: string, signal?: AbortSignal): Promise<RevisionContract[]> =>\n this.get<RevisionContract[]>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions`, undefined, signal),\n revision: (project: string, entry: string, revision: string, signal?: AbortSignal): Promise<RevisionContract> =>\n this.get<RevisionContract>(`/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}`, undefined, signal),\n restoreRevision: (project: string, entry: string, revision: string): Promise<RestoreRevisionResponse> =>\n this.mutate<RestoreRevisionResponse>(\n \"POST\",\n `/projects/${enc(project)}/entries/${enc(entry)}/revisions/${enc(revision)}/restore`,\n ),\n };\n\n // --- Change sets ----------------------------------------------------------\n readonly changeSets = {\n list: (project: string, opts: ListOptions & { status?: string } = {}): Promise<Page<ChangeSetContract>> =>\n this.page<ChangeSetContract>(`/projects/${enc(project)}/change-sets` + query({ status: opts.status }), opts),\n create: (project: string, body: CreateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets`, body),\n get: (project: string, changeSet: string, signal?: AbortSignal): Promise<ChangeSetContract> =>\n this.get<ChangeSetContract>(`/projects/${enc(project)}/change-sets/${enc(changeSet)}`, undefined, signal),\n update: (project: string, changeSet: string, body: UpdateChangeSetRequest): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"PATCH\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}`, body),\n validate: (project: string, changeSet: string): Promise<{ valid: boolean; errors: ValidationIssue[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/validate`),\n publish: (\n project: string,\n changeSet: string,\n ): Promise<{ changeSet: ChangeSetContract; publishedEntryIds: string[] }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/publish`, { confirm: true }),\n close: (project: string, changeSet: string): Promise<ChangeSetContract> =>\n this.mutate<ChangeSetContract>(\"POST\", `/projects/${enc(project)}/change-sets/${enc(changeSet)}/close`),\n };\n\n // --- Previews -------------------------------------------------------------\n readonly previews = {\n create: (project: string, body: CreatePreviewRequest): Promise<PreviewContract> =>\n this.mutate<PreviewContract>(\"POST\", `/projects/${enc(project)}/previews`, body),\n list: (project: string, signal?: AbortSignal): Promise<PreviewContract[]> =>\n this.get<PreviewContract[]>(`/projects/${enc(project)}/previews`, undefined, signal),\n revoke: (project: string, preview: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/previews/${enc(preview)}`),\n };\n\n // --- Assets ---------------------------------------------------------------\n readonly assets = {\n createUpload: (project: string, body: CreateUploadRequest): Promise<CreateUploadResponse> =>\n this.mutate<CreateUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads`, body),\n completeUpload: (project: string, upload: string): Promise<AssetContract> =>\n this.mutate<CompleteUploadResponse>(\"POST\", `/projects/${enc(project)}/assets/uploads/${enc(upload)}/complete`).then(\n (r) => r.asset,\n ),\n list: (project: string, opts: ListOptions = {}): Promise<Page<AssetContract>> =>\n this.page<AssetContract>(`/projects/${enc(project)}/assets`, opts),\n get: (project: string, asset: string, signal?: AbortSignal): Promise<AssetContract> =>\n this.get<AssetContract>(`/projects/${enc(project)}/assets/${enc(asset)}`, undefined, signal),\n usage: (project: string, asset: string, signal?: AbortSignal): Promise<{ asset: AssetContract; usage: { entryIds: string[] } }> =>\n this.get(`/projects/${enc(project)}/assets/${enc(asset)}`, { usage: \"true\" }, signal),\n update: (project: string, asset: string, body: UpdateAssetRequest): Promise<AssetContract> =>\n this.mutate<AssetContract>(\"PATCH\", `/projects/${enc(project)}/assets/${enc(asset)}`, body),\n delete: (project: string, asset: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/assets/${enc(asset)}`),\n /** Full presigned upload flow: create → PUT bytes → complete. */\n upload: (project: string, input: AssetInput, meta: UploadAssetMeta = {}): Promise<AssetContract> =>\n this.uploadAsset(project, input, meta),\n };\n\n // --- API keys -------------------------------------------------------------\n readonly apiKeys = {\n listForOrganization: (organization: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/organizations/${enc(organization)}/api-keys`, undefined, signal),\n createForOrganization: (organization: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/organizations/${enc(organization)}/api-keys`, body),\n revokeForOrganization: (organization: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/organizations/${enc(organization)}/api-keys/${enc(key)}`),\n listForProject: (project: string, signal?: AbortSignal): Promise<ApiKeyContract[]> =>\n this.get<ApiKeyContract[]>(`/projects/${enc(project)}/api-keys`, undefined, signal),\n createForProject: (project: string, body: CreateApiKeyRequest): Promise<CreateApiKeyResponse> =>\n this.mutate<CreateApiKeyResponse>(\"POST\", `/projects/${enc(project)}/api-keys`, body),\n revokeForProject: (project: string, key: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/api-keys/${enc(key)}`),\n };\n\n // --- Webhooks -------------------------------------------------------------\n readonly webhooks = {\n list: (project: string, signal?: AbortSignal): Promise<WebhookEndpointContract[]> =>\n this.get<WebhookEndpointContract[]>(`/projects/${enc(project)}/webhooks`, undefined, signal),\n create: (project: string, body: CreateWebhookRequest): Promise<CreateWebhookResponse> =>\n this.mutate<CreateWebhookResponse>(\"POST\", `/projects/${enc(project)}/webhooks`, body),\n update: (project: string, webhook: string, body: UpdateWebhookRequest): Promise<WebhookEndpointContract> =>\n this.mutate<WebhookEndpointContract>(\"PATCH\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`, body),\n delete: (project: string, webhook: string): Promise<{ ok: boolean }> =>\n this.mutate(\"DELETE\", `/projects/${enc(project)}/webhooks/${enc(webhook)}`),\n deliveries: (project: string, webhook: string, signal?: AbortSignal): Promise<WebhookDeliveryContract[]> =>\n this.get<WebhookDeliveryContract[]>(`/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries`, undefined, signal),\n retry: (project: string, webhook: string, delivery: string): Promise<{ ok: boolean }> =>\n this.mutate(\"POST\", `/projects/${enc(project)}/webhooks/${enc(webhook)}/deliveries/${enc(delivery)}/retry`),\n };\n\n // --- Activity -------------------------------------------------------------\n activity(\n project: string,\n opts: ListOptions & { actorType?: string; action?: string; targetType?: string; from?: string; to?: string } = {},\n ): Promise<Page<ActivityEventContract>> {\n return this.page<ActivityEventContract>(\n `/projects/${enc(project)}/activity` +\n query({\n actorType: opts.actorType,\n action: opts.action,\n targetType: opts.targetType,\n from: opts.from,\n to: opts.to,\n }),\n opts,\n );\n }\n\n // --- Billing --------------------------------------------------------------\n readonly billing = {\n status: (organization: string, signal?: AbortSignal): Promise<BillingResponse> =>\n this.get<BillingResponse>(`/organizations/${enc(organization)}/billing`, undefined, signal),\n checkout: (organization: string, body: CheckoutRequest): Promise<CheckoutResponse> =>\n this.mutate<CheckoutResponse>(\"POST\", `/organizations/${enc(organization)}/billing/checkout`, body),\n portal: (organization: string): Promise<PortalResponse> =>\n this.mutate<PortalResponse>(\"POST\", `/organizations/${enc(organization)}/billing/portal`),\n };\n\n // --- Upload helper --------------------------------------------------------\n private async uploadAsset(project: string, input: AssetInput, meta: UploadAssetMeta): Promise<AssetContract> {\n const { bytes, filename } = await readInput(input, meta.filename);\n const contentType = meta.contentType ?? guessContentType(filename);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n\n const upload = await this.assets.createUpload(project, {\n filename,\n contentType,\n byteSize: meta.byteSize ?? bytes.byteLength,\n checksum,\n });\n\n // The presigned URL is absolute (storage host) and must bypass the API base.\n const put = await this.fetchImpl(upload.url, {\n method: upload.method,\n headers: upload.headers,\n body: bytes as unknown as BodyInit,\n });\n if (!put.ok) {\n throw new Error(`Asset upload PUT failed with status ${put.status}.`);\n }\n\n return this.assets.completeUpload(project, upload.uploadId);\n }\n}\n\ninterface ValidationIssue {\n resourceType: string;\n resourceId: string;\n path: string;\n message: string;\n code?: string;\n}\n\nasync function readInput(input: AssetInput, filenameOverride?: string): Promise<{ bytes: Uint8Array; filename: string }> {\n if (typeof input === \"string\") {\n const bytes = await readFile(input);\n return { bytes: new Uint8Array(bytes), filename: filenameOverride ?? basename(input) };\n }\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n return { bytes, filename: filenameOverride ?? \"upload.bin\" };\n}\n\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n pdf: \"application/pdf\",\n json: \"application/json\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n csv: \"text/csv\",\n mp4: \"video/mp4\",\n webm: \"video/webm\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n};\n\nfunction guessContentType(filename: string): string {\n const ext = filename.split(\".\").pop()?.toLowerCase() ?? \"\";\n return CONTENT_TYPES[ext] ?? \"application/octet-stream\";\n}\n\nfunction enc(segment: string): string {\n return encodeURIComponent(segment);\n}\n\nfunction query(params: Record<string, string | undefined>): string {\n const entries = Object.entries(params).filter(([, v]) => v !== undefined && v !== \"\");\n if (entries.length === 0) return \"\";\n return \"?\" + entries.map(([k, v]) => `${k}=${encodeURIComponent(v as string)}`).join(\"&\");\n}\n\n/** Create a management client. */\nexport function createManagementClient(options: ManagementClientOptions): ManagementClient {\n return new ManagementClient(options);\n}\n\nexport { generateTypes, generateTypesModule } from \"./codegen.js\";\nexport { MynaApiError, isMynaApiError } from \"./errors.js\";\nexport type { FetchLike, RetryOptions } from \"./http.js\";\n","import type {\n CollectionSchema,\n FieldDef,\n ListItem,\n ObjectField,\n} from \"../../schema/src/types.js\";\n\n/**\n * Deterministic TypeScript type generation from canonical collection schemas\n * (SPEC 12). Pure and stable: the same input always yields byte-identical\n * output, and no user-written files are touched. Consumed by `myna types\n * generate`.\n */\nexport function generateTypes(collections: CollectionSchema[]): string {\n const sorted = [...collections].sort((a, b) => a.name.localeCompare(b.name));\n const blocks: string[] = [];\n\n for (const collection of sorted) {\n blocks.push(renderInterface(collection));\n }\n\n const registry = sorted\n .map((c) => ` ${JSON.stringify(c.name)}: ${pascal(c.name)};`)\n .join(\"\\n\");\n\n const header = [\n \"// Generated by `myna types generate`. Do not edit by hand.\",\n \"// This file is safe to commit and regenerate.\",\n \"\",\n ].join(\"\\n\");\n\n return `${header}${blocks.join(\"\\n\\n\")}\\n\\nexport interface MynaCollections {\\n${registry}\\n}\\n`;\n}\n\nfunction renderInterface(collection: CollectionSchema): string {\n const name = pascal(collection.name);\n const lines = collection.fields.map((f) => renderField(f, 1));\n const label = collection.label ? ` ${collection.label}` : \"\";\n return `/**${label} (${collection.kind}) */\\nexport interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction renderField(field: FieldDef, depth: number): string {\n const indent = \" \".repeat(depth);\n const optional = field.required ? \"\" : \"?\";\n const doc = field.description ? `${indent}/** ${escapeComment(field.description)} */\\n` : \"\";\n return `${doc}${indent}${safeKey(field.key)}${optional}: ${fieldType(field, depth)};`;\n}\n\nfunction fieldType(field: FieldDef, depth: number): string {\n switch (field.type) {\n case \"text\":\n return field.enum && field.enum.length > 0 ? field.enum.map((v) => JSON.stringify(v)).join(\" | \") : \"string\";\n case \"slug\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"asset\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"reference\":\n return field.multiple ? \"string[]\" : \"string\";\n case \"object\":\n return renderObject(field, depth);\n case \"list\":\n return `${listItemType(field.item, depth)}[]`;\n default:\n return \"unknown\";\n }\n}\n\nfunction renderObject(field: ObjectField, depth: number): string {\n const lines = field.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n}\n\nfunction listItemType(item: ListItem, depth: number): string {\n switch (item.kind) {\n case \"text\":\n return item.enum && item.enum.length > 0 ? `(${item.enum.map((v) => JSON.stringify(v)).join(\" | \")})` : \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"date\":\n case \"datetime\":\n return \"string\";\n case \"markdown\":\n return \"string\";\n case \"json\":\n return \"JsonValue\";\n case \"reference\":\n return \"string\";\n case \"asset\":\n return \"string\";\n case \"object\": {\n const lines = item.fields.map((f) => renderField(f, depth + 1));\n const closingIndent = \" \".repeat(depth);\n return `{\\n${lines.join(\"\\n\")}\\n${closingIndent}}`;\n }\n default:\n return \"unknown\";\n }\n}\n\nconst JSON_VALUE = \"export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\";\n\n/** Generate types plus the shared `JsonValue` helper as a standalone module. */\nexport function generateTypesModule(collections: CollectionSchema[]): string {\n return `${JSON_VALUE}\\n\\n${generateTypes(collections)}`;\n}\n\nfunction pascal(key: string): string {\n return key\n .split(/[-_\\s]+/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction safeKey(key: string): string {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction escapeComment(text: string): string {\n return text.replace(/\\*\\//g, \"*\\\\/\");\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ManagementClient } from \"@myna-sh/sdk/management\";\nimport { isMynaApiError } from \"@myna-sh/sdk/management\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * The 17 Myna MCP tools (SPEC 13). This module contains no CMS business logic —\n * every tool is a thin adapter over the management SDK.\n */\n\nfunction ok(text: string, structured: unknown): CallToolResult {\n return {\n content: [{ type: \"text\", text }],\n structuredContent: structured as Record<string, unknown>,\n };\n}\n\nfunction fail(error: unknown): CallToolResult {\n const message = isMynaApiError(error)\n ? `${error.code}: ${error.detail ?? error.title}`\n : error instanceof Error\n ? error.message\n : String(error);\n return { content: [{ type: \"text\", text: `Error: ${message}` }], isError: true };\n}\n\nasync function resolveEntryId(client: ManagementClient, project: string, ref: string): Promise<string> {\n if (ref.startsWith(\"ent_\") && !ref.includes(\"/\")) return ref;\n const [collection, slug] = ref.includes(\"/\") ? ref.split(\"/\", 2) : [undefined, ref];\n if (!collection) throw new Error(`Provide the entry as \"<collection>/<slug>\" or an ent_ id (got \"${ref}\").`);\n let cursor: string | undefined;\n for (let i = 0; i < 50; i++) {\n const page = await client.entries.list(project, { collection, limit: 100, cursor });\n const match = page.data.find((e) => e.slug === slug || e.id === slug);\n if (match) return match.id;\n if (!page.nextCursor) break;\n cursor = page.nextCursor;\n }\n throw new Error(`Entry not found: ${ref}`);\n}\n\nconst projectArg = { project: z.string().optional().describe(\"Project id, slug, or configured name. Omit to use the default.\") };\n\nexport function registerTools(server: McpServer, registry: ProjectRegistry): void {\n // 1. list projects\n server.registerTool(\n \"myna_list_projects\",\n {\n title: \"List projects\",\n description: \"List projects in an organization.\",\n inputSchema: {\n organization: z.string().optional().describe(\"Organization id or slug. Omit to use the default.\"),\n ...projectArg,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client } = registry.clientFor(args.project);\n const org = registry.organizationFor(args.project, args.organization);\n const projects = await client.projects.list(org);\n return ok(`${projects.length} project(s) in ${org}.`, { projects });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 2. get project\n server.registerTool(\n \"myna_get_project\",\n {\n title: \"Get project\",\n description: \"Fetch a single project's details.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.projects.get(project);\n return ok(`Project ${result.name} (${result.slug}).`, { project: result });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 3. list collections\n server.registerTool(\n \"myna_list_collections\",\n {\n title: \"List collections\",\n description: \"List the deployed collections in a project.\",\n inputSchema: { ...projectArg },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const collections = await client.schema.collections(project);\n return ok(`${collections.length} collection(s).`, { collections });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 4. get collection schema\n server.registerTool(\n \"myna_get_collection_schema\",\n {\n title: \"Get collection schema\",\n description: \"Fetch the latest canonical schema for a collection.\",\n inputSchema: { ...projectArg, collection: z.string().describe(\"Collection key.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const versions = await client.schema.versions(project, args.collection);\n const latest = versions[0];\n if (!latest) throw new Error(`Collection ${args.collection} has no versions.`);\n return ok(`${args.collection} schema v${latest.version}.`, { version: latest.version, schema: latest.schemaJson });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 5. list entries\n server.registerTool(\n \"myna_list_entries\",\n {\n title: \"List entries\",\n description: \"List entries in a collection.\",\n inputSchema: {\n ...projectArg,\n collection: z.string().describe(\"Collection key.\"),\n status: z.enum([\"draft\", \"published\", \"changed\", \"unpublished\", \"deleted\"]).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n cursor: z.string().optional(),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const page = await client.entries.list(project, {\n collection: args.collection,\n status: args.status,\n limit: args.limit ?? 25,\n cursor: args.cursor,\n });\n return ok(`${page.data.length} entr(y/ies).`, { entries: page.data, nextCursor: page.nextCursor });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 6. get entry\n server.registerTool(\n \"myna_get_entry\",\n {\n title: \"Get entry\",\n description: \"Fetch one entry by \\\"<collection>/<slug>\\\" or entry id.\",\n inputSchema: { ...projectArg, entry: z.string().describe(\"collection/slug or ent_ id.\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.get(project, id);\n return ok(`Entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 7. create change set\n server.registerTool(\n \"myna_create_change_set\",\n {\n title: \"Create change set\",\n description: \"Open a new change set to group entry and asset operations.\",\n inputSchema: {\n ...projectArg,\n title: z.string().min(1).max(200),\n description: z.string().max(2000).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.create(project, { title: args.title, description: args.description });\n return ok(`Created change set ${cs.id}.`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 8. get change set\n server.registerTool(\n \"myna_get_change_set\",\n {\n title: \"Get change set\",\n description: \"Fetch a change set and its items.\",\n inputSchema: { ...projectArg, changeSet: z.string().describe(\"Change set id (chs_).\") },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const cs = await client.changeSets.get(project, args.changeSet);\n return ok(`Change set ${cs.id} (${cs.status}), ${cs.items.length} item(s).`, { changeSet: cs });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 9. create entry\n server.registerTool(\n \"myna_create_entry\",\n {\n title: \"Create entry\",\n description: \"Create a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n collection: z.string(),\n data: z.record(z.string(), z.unknown()).describe(\"Field values.\"),\n slug: z.string().optional(),\n changeSet: z.string().optional().describe(\"Attach to an existing change set (chs_).\"),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const entry = await client.entries.create(project, {\n collection: args.collection,\n data: args.data,\n slug: args.slug,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Created entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 10. update entry\n server.registerTool(\n \"myna_update_entry\",\n {\n title: \"Update entry\",\n description: \"Update a draft entry. Does not publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string().describe(\"collection/slug or ent_ id.\"),\n data: z.record(z.string(), z.unknown()).optional(),\n slug: z.string().optional(),\n expectedRevisionId: z.string().optional().describe(\"Optimistic concurrency guard.\"),\n changeSet: z.string().optional(),\n changeSummary: z.string().max(500).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const entry = await client.entries.update(project, id, {\n data: args.data,\n slug: args.slug,\n expectedRevisionId: args.expectedRevisionId,\n changeSetId: args.changeSet,\n changeSummary: args.changeSummary,\n });\n return ok(`Updated entry ${entry.id} (${entry.status}).`, { entry });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 11. delete entry (destructive)\n server.registerTool(\n \"myna_delete_entry\",\n {\n title: \"Delete entry\",\n description: \"Stage an entry deletion on a change set. Requires confirm=true. Takes effect only on publish.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n changeSet: z.string().optional(),\n confirm: z.literal(true).describe(\"Must be true to proceed.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.delete(project, id, args.changeSet);\n return ok(`Staged delete of ${id} on ${result.changeSetId}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 12. upload asset\n server.registerTool(\n \"myna_upload_asset\",\n {\n title: \"Upload asset\",\n description: \"Upload an asset from base64 bytes or a local file path via the presigned flow.\",\n inputSchema: {\n ...projectArg,\n filename: z.string().describe(\"Display filename, e.g. cover.png.\"),\n base64: z.string().optional().describe(\"Base64-encoded file bytes.\"),\n path: z.string().optional().describe(\"Local filesystem path (stdio hosts only).\"),\n contentType: z.string().optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n if (!args.base64 && !args.path) throw new Error(\"Provide either `base64` or `path`.\");\n const input = args.base64 ? new Uint8Array(Buffer.from(args.base64, \"base64\")) : args.path!;\n const asset = await client.assets.upload(project, input, {\n filename: args.filename,\n contentType: args.contentType,\n });\n return ok(`Uploaded ${asset.displayFilename} (${asset.id}).`, { asset });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 13. validate change set\n server.registerTool(\n \"myna_validate_change_set\",\n {\n title: \"Validate change set\",\n description: \"Validate every changed resource in a change set against the deployed schemas.\",\n inputSchema: { ...projectArg, changeSet: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.validate(project, args.changeSet);\n return ok(result.valid ? \"Change set is valid.\" : `Invalid: ${result.errors.length} error(s).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 14. create preview\n server.registerTool(\n \"myna_create_preview\",\n {\n title: \"Create preview\",\n description: \"Create one preview URL for a change set (or entry). Never publishes.\",\n inputSchema: {\n ...projectArg,\n changeSet: z.string().optional().describe(\"Change set id (chs_).\"),\n entry: z.string().optional().describe(\"Entry id (ent_).\"),\n expiresInSeconds: z.number().int().min(60).max(604800).optional(),\n },\n annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n if (Boolean(args.changeSet) === Boolean(args.entry)) {\n throw new Error(\"Provide exactly one of `changeSet` or `entry`.\");\n }\n const { client, project } = registry.clientFor(args.project);\n const preview = await client.previews.create(project, {\n changeSetId: args.changeSet,\n entryId: args.entry,\n expiresInSeconds: args.expiresInSeconds,\n });\n return ok(`Preview: ${preview.url}`, { preview });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 15. publish change set (destructive)\n server.registerTool(\n \"myna_publish_change_set\",\n {\n title: \"Publish change set\",\n description: \"Atomically publish a change set. Requires confirm=true and content:publish scope.\",\n inputSchema: { ...projectArg, changeSet: z.string(), confirm: z.literal(true).describe(\"Must be true.\") },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const result = await client.changeSets.publish(project, args.changeSet);\n return ok(`Published ${result.publishedEntryIds.length} entr(y/ies).`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 16. get entry revisions\n server.registerTool(\n \"myna_get_entry_revisions\",\n {\n title: \"Get entry revisions\",\n description: \"List the immutable revisions of an entry.\",\n inputSchema: { ...projectArg, entry: z.string() },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const revisions = await client.entries.revisions(project, id);\n return ok(`${revisions.length} revision(s).`, { revisions });\n } catch (error) {\n return fail(error);\n }\n },\n );\n\n // 17. restore revision (destructive)\n server.registerTool(\n \"myna_restore_revision\",\n {\n title: \"Restore revision\",\n description: \"Restore a historical revision into a new draft revision. Requires confirm=true.\",\n inputSchema: {\n ...projectArg,\n entry: z.string(),\n revision: z.string().describe(\"Revision id (rev_).\"),\n confirm: z.literal(true).describe(\"Must be true.\"),\n },\n annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },\n },\n async (args) => {\n try {\n const { client, project } = registry.clientFor(args.project);\n const id = await resolveEntryId(client, project, args.entry);\n const result = await client.entries.restoreRevision(project, id, args.revision);\n return ok(`Restored into ${result.revision.id}.`, result);\n } catch (error) {\n return fail(error);\n }\n },\n );\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { ProjectRegistry } from \"./config.js\";\n\n/**\n * MCP resources (SPEC 13): project summaries, collection schemas, entry and\n * revision representations, and change-set validation results.\n */\nexport function registerResources(server: McpServer, registry: ProjectRegistry): void {\n const json = (uri: string, value: unknown): ReadResourceResult => ({\n contents: [{ uri, mimeType: \"application/json\", text: JSON.stringify(value, null, 2) }],\n });\n\n // Project summaries for the default organization.\n server.registerResource(\n \"projects\",\n \"myna://projects\",\n { title: \"Projects\", description: \"Projects in the default organization.\", mimeType: \"application/json\" },\n async (uri) => {\n const { client } = registry.clientFor();\n const org = registry.organizationFor();\n const projects = await client.projects.list(org);\n return json(uri.href, { organization: org, projects });\n },\n );\n\n // Collection list for a project.\n server.registerResource(\n \"collections\",\n new ResourceTemplate(\"myna://{project}/collections\", { list: undefined }),\n { title: \"Collections\", description: \"Deployed collections for a project.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const project = String(variables.project);\n const { client, project: ref } = registry.clientFor(project);\n const collections = await client.schema.collections(ref);\n return json(uri.href, { project: ref, collections });\n },\n );\n\n // Canonical schema for one collection.\n server.registerResource(\n \"collection-schema\",\n new ResourceTemplate(\"myna://{project}/collection/{key}\", { list: undefined }),\n { title: \"Collection schema\", description: \"Latest canonical schema for a collection.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const versions = await client.schema.versions(project, String(variables.key));\n const latest = versions[0];\n return json(uri.href, { collection: String(variables.key), version: latest?.version ?? null, schema: latest?.schemaJson ?? null });\n },\n );\n\n // Entry representation (by entry id).\n server.registerResource(\n \"entry\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}\", { list: undefined }),\n { title: \"Entry\", description: \"An entry's current representation.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const entry = await client.entries.get(project, String(variables.entry));\n return json(uri.href, { entry });\n },\n );\n\n // Entry revisions.\n server.registerResource(\n \"entry-revisions\",\n new ResourceTemplate(\"myna://{project}/entry/{entry}/revisions\", { list: undefined }),\n { title: \"Entry revisions\", description: \"Immutable revisions for an entry.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const revisions = await client.entries.revisions(project, String(variables.entry));\n return json(uri.href, { entry: String(variables.entry), revisions });\n },\n );\n\n // Change-set validation results.\n server.registerResource(\n \"change-set-validation\",\n new ResourceTemplate(\"myna://{project}/change-set/{changeSet}/validation\", { list: undefined }),\n { title: \"Change-set validation\", description: \"Validation result for a change set.\", mimeType: \"application/json\" },\n async (uri, variables) => {\n const { client, project } = registry.clientFor(String(variables.project));\n const result = await client.changeSets.validate(project, String(variables.changeSet));\n return json(uri.href, result);\n },\n );\n}\n","import { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { ProjectRegistry } from \"./config.js\";\nimport { createServerForRegistry } from \"./server.js\";\n\nexport interface HttpOptions {\n port: number;\n /** Bearer token required in the `Authorization` header. */\n authToken?: string;\n path?: string;\n}\n\nfunction readBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (c: Buffer) => chunks.push(c));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf8\");\n if (!raw) return resolve(undefined);\n try {\n resolve(JSON.parse(raw));\n } catch (error) {\n reject(error);\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nfunction bearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n return header?.startsWith(\"Bearer \") ? header.slice(7).trim() : undefined;\n}\n\n/**\n * Streamable HTTP transport (SPEC 13). Stateless: a fresh server + transport per\n * request. Authenticated by a bearer token in the `Authorization` header.\n */\nexport async function runHttp(options: HttpOptions): Promise<void> {\n const registry = new ProjectRegistry();\n const path = options.path ?? \"/mcp\";\n\n const httpServer = createHttpServer((req: IncomingMessage, res: ServerResponse) => {\n void handle(req, res).catch((error: unknown) => {\n if (!res.headersSent) res.writeHead(500, { \"content-type\": \"application/json\" });\n res.end(JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32603, message: String(error) }, id: null }));\n });\n });\n\n async function handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n if (url.pathname === \"/health\") {\n res.writeHead(200, { \"content-type\": \"application/json\" }).end(JSON.stringify({ ok: true }));\n return;\n }\n if (url.pathname !== path) {\n res.writeHead(404, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"not found\" }));\n return;\n }\n if (options.authToken && bearer(req) !== options.authToken) {\n res.writeHead(401, { \"content-type\": \"application/json\" }).end(JSON.stringify({ error: \"unauthorized\" }));\n return;\n }\n if (req.method !== \"POST\") {\n // Stateless server: no standalone SSE stream.\n res.writeHead(405, { \"content-type\": \"application/json\", allow: \"POST\" }).end(\n JSON.stringify({ jsonrpc: \"2.0\", error: { code: -32000, message: \"Method not allowed.\" }, id: null }),\n );\n return;\n }\n\n const body = await readBody(req);\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n const server = createServerForRegistry(registry);\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n }\n\n await new Promise<void>((resolve) => httpServer.listen(options.port, resolve));\n process.stderr.write(`myna-mcp: streamable HTTP transport listening on :${options.port}${path}\\n`);\n}\n"],"mappings":"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","names":["McpServer","query","query","bytes","DEFAULT_API_URL","McpServer"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@myna-sh/mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"type": "module",
|
|
9
|
+
"license": "UNLICENSED",
|
|
10
|
+
"bin": {
|
|
11
|
+
"myna-mcp": "bin/mcp.mjs"
|
|
12
|
+
},
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/main.d.ts",
|
|
16
|
+
"import": "./dist/main.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"bin"
|
|
22
|
+
],
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@modelcontextprotocol/sdk": "1.20.0",
|
|
25
|
+
"zod": "3.25.76"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "24.13.3",
|
|
29
|
+
"eslint": "9.39.5",
|
|
30
|
+
"typescript": "5.9.3",
|
|
31
|
+
"@myna-sh/api-contracts": "0.0.0",
|
|
32
|
+
"@myna-sh/sdk": "0.1.0",
|
|
33
|
+
"@myna-sh/config": "0.0.0"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
38
|
+
"lint": "eslint src",
|
|
39
|
+
"clean": "rm -rf dist"
|
|
40
|
+
}
|
|
41
|
+
}
|