@stigmer/mcp-server 3.0.8-dev.20260612122433

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +157 -0
  3. package/cli/mcp-server-stigmer.d.ts +3 -0
  4. package/cli/mcp-server-stigmer.d.ts.map +1 -0
  5. package/cli/mcp-server-stigmer.js +201 -0
  6. package/cli/mcp-server-stigmer.js.map +1 -0
  7. package/config.d.ts +44 -0
  8. package/config.d.ts.map +1 -0
  9. package/config.js +92 -0
  10. package/config.js.map +1 -0
  11. package/domains/agents/apply.d.ts +4 -0
  12. package/domains/agents/apply.d.ts.map +1 -0
  13. package/domains/agents/apply.js +25 -0
  14. package/domains/agents/apply.js.map +1 -0
  15. package/domains/agents/delete.d.ts +3 -0
  16. package/domains/agents/delete.d.ts.map +1 -0
  17. package/domains/agents/delete.js +35 -0
  18. package/domains/agents/delete.js.map +1 -0
  19. package/domains/agents/fetch.d.ts +6 -0
  20. package/domains/agents/fetch.d.ts.map +1 -0
  21. package/domains/agents/fetch.js +24 -0
  22. package/domains/agents/fetch.js.map +1 -0
  23. package/domains/agents/resources.d.ts +5 -0
  24. package/domains/agents/resources.d.ts.map +1 -0
  25. package/domains/agents/resources.js +16 -0
  26. package/domains/agents/resources.js.map +1 -0
  27. package/domains/agents/tools.d.ts +5 -0
  28. package/domains/agents/tools.d.ts.map +1 -0
  29. package/domains/agents/tools.js +41 -0
  30. package/domains/agents/tools.js.map +1 -0
  31. package/domains/client.d.ts +53 -0
  32. package/domains/client.d.ts.map +1 -0
  33. package/domains/client.js +62 -0
  34. package/domains/client.js.map +1 -0
  35. package/domains/marshal.d.ts +8 -0
  36. package/domains/marshal.d.ts.map +1 -0
  37. package/domains/marshal.js +17 -0
  38. package/domains/marshal.js.map +1 -0
  39. package/domains/mcpservers/apply.d.ts +4 -0
  40. package/domains/mcpservers/apply.d.ts.map +1 -0
  41. package/domains/mcpservers/apply.js +26 -0
  42. package/domains/mcpservers/apply.js.map +1 -0
  43. package/domains/mcpservers/delete.d.ts +6 -0
  44. package/domains/mcpservers/delete.d.ts.map +1 -0
  45. package/domains/mcpservers/delete.js +42 -0
  46. package/domains/mcpservers/delete.js.map +1 -0
  47. package/domains/mcpservers/fetch.d.ts +7 -0
  48. package/domains/mcpservers/fetch.d.ts.map +1 -0
  49. package/domains/mcpservers/fetch.js +26 -0
  50. package/domains/mcpservers/fetch.js.map +1 -0
  51. package/domains/mcpservers/resources.d.ts +5 -0
  52. package/domains/mcpservers/resources.d.ts.map +1 -0
  53. package/domains/mcpservers/resources.js +16 -0
  54. package/domains/mcpservers/resources.js.map +1 -0
  55. package/domains/mcpservers/tools.d.ts +5 -0
  56. package/domains/mcpservers/tools.d.ts.map +1 -0
  57. package/domains/mcpservers/tools.js +39 -0
  58. package/domains/mcpservers/tools.js.map +1 -0
  59. package/domains/resourcehandler.d.ts +27 -0
  60. package/domains/resourcehandler.d.ts.map +1 -0
  61. package/domains/resourcehandler.js +32 -0
  62. package/domains/resourcehandler.js.map +1 -0
  63. package/domains/resourceuri.d.ts +34 -0
  64. package/domains/resourceuri.d.ts.map +1 -0
  65. package/domains/resourceuri.js +100 -0
  66. package/domains/resourceuri.js.map +1 -0
  67. package/domains/rpcerr.d.ts +8 -0
  68. package/domains/rpcerr.d.ts.map +1 -0
  69. package/domains/rpcerr.js +42 -0
  70. package/domains/rpcerr.js.map +1 -0
  71. package/domains/search/tools.d.ts +5 -0
  72. package/domains/search/tools.d.ts.map +1 -0
  73. package/domains/search/tools.js +125 -0
  74. package/domains/search/tools.js.map +1 -0
  75. package/domains/skills/delete.d.ts +6 -0
  76. package/domains/skills/delete.d.ts.map +1 -0
  77. package/domains/skills/delete.js +38 -0
  78. package/domains/skills/delete.js.map +1 -0
  79. package/domains/skills/fetch.d.ts +6 -0
  80. package/domains/skills/fetch.d.ts.map +1 -0
  81. package/domains/skills/fetch.js +28 -0
  82. package/domains/skills/fetch.js.map +1 -0
  83. package/domains/skills/resources.d.ts +5 -0
  84. package/domains/skills/resources.d.ts.map +1 -0
  85. package/domains/skills/resources.js +25 -0
  86. package/domains/skills/resources.js.map +1 -0
  87. package/domains/skills/tools.d.ts +5 -0
  88. package/domains/skills/tools.d.ts.map +1 -0
  89. package/domains/skills/tools.js +39 -0
  90. package/domains/skills/tools.js.map +1 -0
  91. package/domains/toolresult.d.ts +12 -0
  92. package/domains/toolresult.d.ts.map +1 -0
  93. package/domains/toolresult.js +30 -0
  94. package/domains/toolresult.js.map +1 -0
  95. package/domains/workflowexecutions/tools.d.ts +5 -0
  96. package/domains/workflowexecutions/tools.d.ts.map +1 -0
  97. package/domains/workflowexecutions/tools.js +80 -0
  98. package/domains/workflowexecutions/tools.js.map +1 -0
  99. package/domains/workflows/apply.d.ts +4 -0
  100. package/domains/workflows/apply.d.ts.map +1 -0
  101. package/domains/workflows/apply.js +30 -0
  102. package/domains/workflows/apply.js.map +1 -0
  103. package/domains/workflows/delete.d.ts +3 -0
  104. package/domains/workflows/delete.d.ts.map +1 -0
  105. package/domains/workflows/delete.js +35 -0
  106. package/domains/workflows/delete.js.map +1 -0
  107. package/domains/workflows/fetch.d.ts +6 -0
  108. package/domains/workflows/fetch.d.ts.map +1 -0
  109. package/domains/workflows/fetch.js +25 -0
  110. package/domains/workflows/fetch.js.map +1 -0
  111. package/domains/workflows/resources.d.ts +5 -0
  112. package/domains/workflows/resources.d.ts.map +1 -0
  113. package/domains/workflows/resources.js +16 -0
  114. package/domains/workflows/resources.js.map +1 -0
  115. package/domains/workflows/taskkinds.d.ts +5 -0
  116. package/domains/workflows/taskkinds.d.ts.map +1 -0
  117. package/domains/workflows/taskkinds.js +66 -0
  118. package/domains/workflows/taskkinds.js.map +1 -0
  119. package/domains/workflows/tools.d.ts +5 -0
  120. package/domains/workflows/tools.d.ts.map +1 -0
  121. package/domains/workflows/tools.js +35 -0
  122. package/domains/workflows/tools.js.map +1 -0
  123. package/domains/workflows/validate.d.ts +5 -0
  124. package/domains/workflows/validate.d.ts.map +1 -0
  125. package/domains/workflows/validate.js +113 -0
  126. package/domains/workflows/validate.js.map +1 -0
  127. package/gen/agent.d.ts +385 -0
  128. package/gen/agent.d.ts.map +1 -0
  129. package/gen/agent.js +170 -0
  130. package/gen/agent.js.map +1 -0
  131. package/gen/apply-runtime.d.ts +18 -0
  132. package/gen/apply-runtime.d.ts.map +1 -0
  133. package/gen/apply-runtime.js +50 -0
  134. package/gen/apply-runtime.js.map +1 -0
  135. package/gen/mcpserver.d.ts +289 -0
  136. package/gen/mcpserver.d.ts.map +1 -0
  137. package/gen/mcpserver.js +166 -0
  138. package/gen/mcpserver.js.map +1 -0
  139. package/gen/workflow.d.ts +805 -0
  140. package/gen/workflow.d.ts.map +1 -0
  141. package/gen/workflow.js +842 -0
  142. package/gen/workflow.js.map +1 -0
  143. package/index.d.ts +20 -0
  144. package/index.d.ts.map +1 -0
  145. package/index.js +58 -0
  146. package/index.js.map +1 -0
  147. package/logger.d.ts +20 -0
  148. package/logger.d.ts.map +1 -0
  149. package/logger.js +41 -0
  150. package/logger.js.map +1 -0
  151. package/package.json +43 -0
  152. package/server.d.ts +60 -0
  153. package/server.d.ts.map +1 -0
  154. package/server.js +366 -0
  155. package/server.js.map +1 -0
  156. package/src/cli/mcp-server-stigmer.ts +42 -0
  157. package/src/config.test.ts +88 -0
  158. package/src/config.ts +151 -0
  159. package/src/domains/agents/apply.ts +30 -0
  160. package/src/domains/agents/delete.ts +41 -0
  161. package/src/domains/agents/fetch.ts +33 -0
  162. package/src/domains/agents/resources.ts +20 -0
  163. package/src/domains/agents/tools.ts +68 -0
  164. package/src/domains/apply.integration.test.ts +220 -0
  165. package/src/domains/client.ts +95 -0
  166. package/src/domains/deletes.integration.test.ts +124 -0
  167. package/src/domains/marshal.ts +21 -0
  168. package/src/domains/mcpservers/apply.ts +36 -0
  169. package/src/domains/mcpservers/delete.ts +51 -0
  170. package/src/domains/mcpservers/fetch.ts +35 -0
  171. package/src/domains/mcpservers/resources.ts +20 -0
  172. package/src/domains/mcpservers/tools.ts +74 -0
  173. package/src/domains/reads.integration.test.ts +134 -0
  174. package/src/domains/resourcehandler.ts +90 -0
  175. package/src/domains/resources.integration.test.ts +139 -0
  176. package/src/domains/resourceuri.test.ts +97 -0
  177. package/src/domains/resourceuri.ts +124 -0
  178. package/src/domains/rpcerr.test.ts +62 -0
  179. package/src/domains/rpcerr.ts +46 -0
  180. package/src/domains/search/search.integration.test.ts +127 -0
  181. package/src/domains/search/tools.ts +160 -0
  182. package/src/domains/skills/delete.ts +44 -0
  183. package/src/domains/skills/fetch.ts +38 -0
  184. package/src/domains/skills/resources.ts +33 -0
  185. package/src/domains/skills/tools.ts +67 -0
  186. package/src/domains/toolresult.ts +33 -0
  187. package/src/domains/workflowexecutions/tools.ts +133 -0
  188. package/src/domains/workflows/apply.ts +40 -0
  189. package/src/domains/workflows/delete.ts +44 -0
  190. package/src/domains/workflows/fetch.ts +34 -0
  191. package/src/domains/workflows/resources.ts +20 -0
  192. package/src/domains/workflows/taskkinds.ts +103 -0
  193. package/src/domains/workflows/tools.ts +68 -0
  194. package/src/domains/workflows/validate.integration.test.ts +117 -0
  195. package/src/domains/workflows/validate.ts +144 -0
  196. package/src/domains/workflows/workflow-tools.integration.test.ts +148 -0
  197. package/src/gen/agent.ts +173 -0
  198. package/src/gen/apply-runtime.ts +52 -0
  199. package/src/gen/mcpserver.ts +163 -0
  200. package/src/gen/workflow.ts +858 -0
  201. package/src/http.integration.test.ts +140 -0
  202. package/src/index.ts +66 -0
  203. package/src/logger.ts +49 -0
  204. package/src/server.integration.test.ts +82 -0
  205. package/src/server.ts +414 -0
@@ -0,0 +1,163 @@
1
+ // Code generated by stigmer-codegen --target=mcp-ts. DO NOT EDIT.
2
+ //
3
+ // Flattened apply-input zod schema + toProto bridge for the McpServer resource.
4
+ // Source proto package: ai.stigmer.agentic.mcpserver.v1
5
+
6
+ import { generateSlug, visibilityFromString } from "./apply-runtime.js";
7
+ import { create } from "@bufbuild/protobuf";
8
+ import { EnvVarDeclarationSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/spec_pb";
9
+ import { McpServerSchema, type McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
10
+ import { McpServerSpecSchema, StdioServerConfigSchema, HttpServerConfigSchema, ToolApprovalPolicySchema, McpServerAuthSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/spec_pb";
11
+ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
12
+ import { ApiResourceReferenceSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/io_pb";
13
+ import { ApiResourceMetadataSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
14
+ import { z } from "zod";
15
+
16
+ /** McpServerSpec defines the configurable properties of an MCP server. @internal This is the "Template" layer — declares capabilities and requirements. The overview.md file provides the SDK-facing description and example YAML. */
17
+ export const McpServerInputShape = {
18
+ name: z.string().describe("Human-readable name of the resource."),
19
+ slug: z.string().optional().describe("URL-friendly identifier (lowercase alphanumeric with hyphens). Auto-generated from name if omitted."),
20
+ org: z.string().describe("Organization that owns this resource (e.g. acme)."),
21
+ visibility: z.string().optional().describe("Resource visibility: PRIVATE or PUBLIC. Omit to leave unchanged on updates."),
22
+ labels: z.record(z.string()).optional().describe("Key-value labels for organization and filtering."),
23
+ tags: z.array(z.string()).optional().describe("Tags for categorization and discovery."),
24
+ description: z.string().optional().describe("Human-readable description for marketplace display and documentation. Should explain what this MCP server does and its primary use cases. Example: 'GitHub MCP server for repository operations, code search, and PR management'"),
25
+ icon_url: z.string().optional().describe("Icon URL for UI display in marketplace and agent configuration screens. Should be a publicly accessible URL to an image (SVG, PNG, or JPEG). Example: 'https://github.githubassets.com/favicons/favicon.svg'"),
26
+ stdio: z.lazy(() => StdioServerConfigInputSchema).optional().describe("stdio-based server (subprocess with stdin/stdout communication). Most common type - used for Node.js, Python, and other CLI-based MCP servers."),
27
+ http: z.lazy(() => HttpServerConfigInputSchema).optional().describe("HTTP-based server (HTTP + Server-Sent Events communication). Used for remote/managed MCP services accessible over the network."),
28
+ default_enabled_tools: z.array(z.string()).optional().describe("Default tools to enable from this MCP server. Empty list means all tools are enabled by default. @internal Tool names must match exactly what the MCP server reports via tools/list. Only names from discovered_capabilities.tools are valid here. Do NOT include names from discovered_capabilities.resource_templates — resource templates are read-only data endpoints, not callable tools. Including a resource template name here causes a fatal runtime error."),
29
+ env: z.record(z.lazy(() => EnvVarDeclarationInputSchema)).optional().describe("Environment variable declarations for this MCP server. Keys are variable names; values describe their metadata and optionality."),
30
+ pinned_tool_approvals: z.array(z.lazy(() => ToolApprovalPolicyInputSchema)).optional().describe("Manual tool approval overrides set by the MCP server owner. @internal These take precedence over system-generated 'McpServerStatus.tool_approvals'. Never auto-modified — only changed by explicit user action (apply/update). Use cases: - Force approval for a tool the classifier marked as auto-approve - Exempt a safe tool the classifier flagged as needing approval - Establish organization-wide safety policies for dangerous tools Policy chain (lowest to highest priority): 1. McpServerStatus.tool_approvals - System-generated defaults 2. McpServerSpec.pinned_tool_approvals - Manual overrides (this field) 3. Agent.McpServerUsage.tool_approval_overrides - Per-agent customization 4. AgentExecution.auto_approve_all - Runtime bypass"),
31
+ repository_url: z.string().optional().describe("URL of the upstream source repository for this MCP server. Shown in the marketplace so users can inspect the implementation for trust and transparency. Example: 'https://github.com/modelcontextprotocol/servers'"),
32
+ github_stars: z.number().optional().describe("GitHub star count at the time of curation. Used as a popularity signal in marketplace display. 0 if unknown or non-GitHub repository."),
33
+ auth: z.lazy(() => McpServerAuthInputSchema).optional().describe("OAuth authentication configuration for automated credential acquisition. When set, the MCP server's Connect page offers an OAuth flow instead of (or in addition to) manual credential entry. The acquired access token is stored in a system-managed environment (identified by grant.environment_id) as the env var named by auth.target_env_var. That env var must also be declared in env so the execution pipeline knows about it."),
34
+ } as const;
35
+
36
+ export const McpServerInputSchema = z.object(McpServerInputShape);
37
+ export type McpServerInput = z.infer<typeof McpServerInputSchema>;
38
+
39
+ const StdioServerConfigInputSchema = z.object({
40
+ command: z.string().describe("Command to execute the MCP server. This is the executable name or path. Examples: 'npx', 'python', 'node', './custom-mcp-server'"),
41
+ args: z.array(z.string()).optional().describe("Arguments to pass to the command. Argument values can reference environment variables using ${VAR_NAME} syntax. These placeholders are resolved at runtime from the execution environment (same source as HTTP header/query param placeholders). This enables MCP servers that take core configuration as positional CLI arguments (e.g. database connection URLs, directory paths) to be parameterized per-user through env declarations. Resolution uses strict mode: missing variables produce a clear error rather than passing a literal '${VAR}' to the subprocess. Note: resolved values appear in the subprocess argv, which is visible via /proc/<pid>/cmdline within the container. In the containerized agent-runner environment this is not a practical concern, but callers should be aware when debugging. Examples: ['-y', '@modelcontextprotocol/server-github'] ['-y', '@modelcontextprotocol/server-postgres', '${POSTGRES_CONNECTION_URL}'] ['-m', 'mcp_server_sqlite', '--db-path', '${DB_PATH}/data.sqlite']"),
42
+ working_dir: z.string().optional().describe("Working directory for the process. If not specified, the process inherits the agent runner's working directory. Use absolute paths or paths relative to the agent runner's context."),
43
+ });
44
+ type StdioServerConfigInput = z.infer<typeof StdioServerConfigInputSchema>;
45
+
46
+ const HttpServerConfigInputSchema = z.object({
47
+ url: z.string().describe("Base URL of the MCP server endpoint. Must be a valid HTTP or HTTPS URL. Examples: - 'http://localhost:3000/mcp' - 'https://mcp.example.com/v1' - 'https://api.company.com/mcp/github'"),
48
+ headers: z.record(z.string()).optional().describe("HTTP headers to include with every request. Use for authentication, API versioning, or custom routing. Header values can reference environment variables using ${VAR_NAME} syntax. These placeholders are resolved at runtime from AgentInstance's environment. Examples: 'Authorization': 'Bearer ${API_TOKEN}' 'X-API-Version': '2024-01' 'X-Tenant-ID': '${TENANT_ID}'"),
49
+ query_params: z.record(z.string()).optional().describe("Query parameters to append to the URL. Values can reference environment variables using ${VAR_NAME} syntax. Examples: 'region': '${AWS_REGION}' 'version': 'v1'"),
50
+ timeout_seconds: z.number().optional().describe("Timeout for HTTP requests in seconds. Applies to both the initial connection and response streaming. Default: 30 seconds if not specified. Set higher values for MCP servers that perform long-running operations."),
51
+ });
52
+ type HttpServerConfigInput = z.infer<typeof HttpServerConfigInputSchema>;
53
+
54
+ const EnvVarDeclarationInputSchema = z.object({
55
+ is_secret: z.boolean().optional().describe("Whether the resolved value should be treated as a secret. @internal When true: encrypted at rest, redacted in logs and Temporal history. When false: stored as plaintext, visible in audit logs."),
56
+ description: z.string().optional().describe("Human-readable description shown in the UI credential form. Should explain what the variable is used for and where to obtain it."),
57
+ optional: z.boolean().optional().describe("Whether this variable is optional. @internal When false (default): the execution pipeline rejects a run if this variable is missing from the user's environment. When true: a missing value is acceptable (the MCP server or agent degrades gracefully without it)."),
58
+ });
59
+ type EnvVarDeclarationInput = z.infer<typeof EnvVarDeclarationInputSchema>;
60
+
61
+ const ToolApprovalPolicyInputSchema = z.object({
62
+ tool_name: z.string().optional().describe("Name of the tool (must match tools/list from MCP server exactly). Case-sensitive matching against tool names reported by the MCP server. Example: 'delete_repository', 'send_email', 'execute_sql'"),
63
+ message: z.string().optional().describe("Human-readable message shown to user when approval is requested. Supports {{args.field}} placeholders for dynamic content. If empty, a default message is generated: 'Execute tool: {tool_name}' Guidelines for effective messages: - Be specific about what will happen - Include the most important argument values using placeholders - Keep under 100 characters for UI display - Use action verbs: 'Delete', 'Send', 'Execute', 'Create'"),
64
+ });
65
+ type ToolApprovalPolicyInput = z.infer<typeof ToolApprovalPolicyInputSchema>;
66
+
67
+ const OauthAppRefInputSchema = z.object({
68
+ org: z.string().optional().describe("Organization that owns the referenced resource. When non-empty: must be a valid org slug (lowercase alphanumeric with hyphens, starts with a letter, 1-63 characters). Example: 'stigmer', 'acme-corp'. When empty: the reference is relative — the server resolves it to the parent resource's organization at write time. All stored and returned references always have org populated (absolute form). Use empty org for same-org references (the common case). Use explicit org for cross-org references (e.g., marketplace resources)."),
69
+ slug: z.string().describe("Resource slug (user-friendly identifier, unique within org). Format: lowercase alphanumeric with hyphens, must start with a letter and end with a letter or digit (e.g., 'web-search', 'code-reviewer'). Length: 2-63 characters."),
70
+ });
71
+ type OauthAppRefInput = z.infer<typeof OauthAppRefInputSchema>;
72
+
73
+ const McpServerAuthInputSchema = z.object({
74
+ oauth_app_ref: z.lazy(() => OauthAppRefInputSchema).optional().describe("Reference to an OAuthApp for vendor-specific OAuth. When empty: the server supports the MCP Authorization spec (DCR + PKCE). Stigmer discovers the authorization server metadata, registers a client via DCR, and performs the authorization code flow with PKCE — all automatically at connect time. When set: Stigmer uses the referenced OAuthApp's client credentials to perform the OAuth authorization code flow with the vendor on behalf of the user. The OAuthApp must belong to the same organization as the McpServer (or be accessible via cross-org reference)."),
75
+ target_env_var: z.string().optional().describe("The env var where the acquired access token is stored. Must correspond to an entry in env so the execution pipeline resolves it. The refresh token is stored as {target_env_var}_REFRESH_TOKEN by convention. Both are written to the grant's managed environment."),
76
+ token_lifetime_hint: z.string().optional().describe("Informational hint about expected token lifetime for UI display. Helps users understand when re-authentication may be needed. Empty means unknown. Examples: '1h', '2h', '90d', 'never'."),
77
+ scope_hints: z.array(z.string()).optional().describe("Optional scope hints for UI display before the OAuth flow starts. For DCR servers: shown to the user since actual scopes are discovered at connect time during authorization server metadata retrieval. For vendor OAuth: informational (scopes are defined on the OAuthApp)."),
78
+ discovery_url: z.string().optional().describe("Optional URL for OAuth authorization server discovery on stdio servers. HTTP servers do not need this: the platform derives the discovery endpoint from http.url (fetching /.well-known/oauth-authorization-server relative to the server URL). Stdio servers have no URL, so DCR discovery has nothing to derive from. Set this field to the base URL of the vendor's OAuth authorization server to enable DCR for a stdio-based MCP server. Resolution priority: 1. discovery_url (if set — used for both stdio and HTTP) 2. http.url (default for HTTP servers) Ignored when oauth_app_ref is set (vendor OAuth uses OAuthApp endpoints directly, no discovery needed)."),
79
+ });
80
+ type McpServerAuthInput = z.infer<typeof McpServerAuthInputSchema>;
81
+
82
+
83
+ /** Build the fully-formed McpServer proto from the flat MCP apply input. */
84
+ export function mcpServerInputToProto(input: McpServerInput): McpServer {
85
+ const slug = input.slug && input.slug.length > 0 ? input.slug : generateSlug(input.name);
86
+ const spec = create(McpServerSpecSchema);
87
+ if (input.description !== undefined) spec.description = input.description;
88
+ if (input.icon_url !== undefined) spec.iconUrl = input.icon_url;
89
+ if (input.stdio !== undefined) spec.serverType = { case: "stdio", value: stdioServerConfigInputToProto(input.stdio) };
90
+ if (input.http !== undefined) spec.serverType = { case: "http", value: httpServerConfigInputToProto(input.http) };
91
+ if (input.default_enabled_tools !== undefined) spec.defaultEnabledTools = input.default_enabled_tools;
92
+ if (input.env !== undefined) {
93
+ for (const [k, v] of Object.entries(input.env)) spec.env[k] = envVarDeclarationInputToProto(v);
94
+ }
95
+ if (input.pinned_tool_approvals !== undefined) spec.pinnedToolApprovals = input.pinned_tool_approvals.map(toolApprovalPolicyInputToProto);
96
+ if (input.repository_url !== undefined) spec.repositoryUrl = input.repository_url;
97
+ if (input.github_stars !== undefined) spec.githubStars = input.github_stars;
98
+ if (input.auth !== undefined) spec.auth = mcpServerAuthInputToProto(input.auth);
99
+ return Object.assign(create(McpServerSchema), {
100
+ apiVersion: "agentic.stigmer.ai/v1",
101
+ kind: "McpServer",
102
+ metadata: Object.assign(create(ApiResourceMetadataSchema), {
103
+ name: input.name,
104
+ slug,
105
+ org: input.org,
106
+ ...(input.visibility !== undefined && { visibility: visibilityFromString(input.visibility) }),
107
+ ...(input.labels !== undefined && { labels: input.labels }),
108
+ ...(input.tags !== undefined && { tags: input.tags }),
109
+ }),
110
+ spec,
111
+ }) as McpServer;
112
+ }
113
+
114
+ function stdioServerConfigInputToProto(input: StdioServerConfigInput) {
115
+ const result = create(StdioServerConfigSchema);
116
+ if (input.command !== undefined) result.command = input.command;
117
+ if (input.args !== undefined) result.args = input.args;
118
+ if (input.working_dir !== undefined) result.workingDir = input.working_dir;
119
+ return result;
120
+ }
121
+
122
+ function httpServerConfigInputToProto(input: HttpServerConfigInput) {
123
+ const result = create(HttpServerConfigSchema);
124
+ if (input.url !== undefined) result.url = input.url;
125
+ if (input.headers !== undefined) result.headers = input.headers;
126
+ if (input.query_params !== undefined) result.queryParams = input.query_params;
127
+ if (input.timeout_seconds !== undefined) result.timeoutSeconds = input.timeout_seconds;
128
+ return result;
129
+ }
130
+
131
+ function envVarDeclarationInputToProto(input: EnvVarDeclarationInput) {
132
+ const result = create(EnvVarDeclarationSchema);
133
+ if (input.is_secret !== undefined) result.isSecret = input.is_secret;
134
+ if (input.description !== undefined) result.description = input.description;
135
+ if (input.optional !== undefined) result.optional = input.optional;
136
+ return result;
137
+ }
138
+
139
+ function toolApprovalPolicyInputToProto(input: ToolApprovalPolicyInput) {
140
+ const result = create(ToolApprovalPolicySchema);
141
+ if (input.tool_name !== undefined) result.toolName = input.tool_name;
142
+ if (input.message !== undefined) result.message = input.message;
143
+ return result;
144
+ }
145
+
146
+ function oauthAppRefInputToProto(input: OauthAppRefInput) {
147
+ return create(ApiResourceReferenceSchema, {
148
+ org: input.org,
149
+ slug: input.slug,
150
+ kind: ApiResourceKind.oauth_app,
151
+ });
152
+ }
153
+
154
+ function mcpServerAuthInputToProto(input: McpServerAuthInput) {
155
+ const result = create(McpServerAuthSchema);
156
+ if (input.oauth_app_ref !== undefined) result.oauthAppRef = oauthAppRefInputToProto(input.oauth_app_ref);
157
+ if (input.target_env_var !== undefined) result.targetEnvVar = input.target_env_var;
158
+ if (input.token_lifetime_hint !== undefined) result.tokenLifetimeHint = input.token_lifetime_hint;
159
+ if (input.scope_hints !== undefined) result.scopeHints = input.scope_hints;
160
+ if (input.discovery_url !== undefined) result.discoveryUrl = input.discovery_url;
161
+ return result;
162
+ }
163
+