mcp-openapi-proxy 0.2.1__tar.gz → 0.3.1__tar.gz

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 (19) hide show
  1. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/PKG-INFO +27 -10
  2. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/README.md +26 -9
  3. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy/server_lowlevel.py +8 -5
  4. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy.egg-info/PKG-INFO +27 -10
  5. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/pyproject.toml +1 -1
  6. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/LICENSE +0 -0
  7. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy/__init__.py +0 -0
  8. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy/handlers.py +0 -0
  9. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy/logging_setup.py +0 -0
  10. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy/openapi.py +0 -0
  11. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy/server_fastmcp.py +0 -0
  12. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy/types.py +0 -0
  13. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy/utils.py +0 -0
  14. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy.egg-info/SOURCES.txt +0 -0
  15. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy.egg-info/dependency_links.txt +0 -0
  16. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy.egg-info/entry_points.txt +0 -0
  17. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy.egg-info/requires.txt +0 -0
  18. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/mcp_openapi_proxy.egg-info/top_level.txt +0 -0
  19. {mcp_openapi_proxy-0.2.1 → mcp_openapi_proxy-0.3.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-openapi-proxy
3
- Version: 0.2.1
3
+ Version: 0.3.1
4
4
  Summary: MCP server for exposing OpenAPI specifications as MCP tools.
5
5
  Author-email: Matthew Hand <11550632+matthewhand@users.noreply.github.com>
6
6
  Requires-Python: >=3.10
@@ -175,15 +175,32 @@ The example configurations below were exercised against the live APIs, and the p
175
175
 
176
176
  | Agent CLI | Model used (live test) | MCP attach mechanism | Tool calls | Prompts/Resources surfaced to model? |
177
177
  |---|---|---|---|---|
178
- | Codex | `gpt-5-codex` (OpenAI API) | `codex exec -c mcp_servers.*` | ✅ native | ❌ (used raw stdio) |
179
- | Gemini | Google OAuth free tier (CLI default model) | project `.gemini/settings.json` `mcpServers` | ✅ native | ❌ interactive slash-commands only |
180
- | Qwen | `agent` group via local LiteLLM gateway | project `.qwen/settings.json` | ✅ native | ❌ NO_PROMPT_ACCESS |
181
- | Kilocode | `kilo-auto/free` | global `settings/mcp_settings.json`, clean workspace | ✅ native | ❌ |
182
- | opencode | `orchestration` group via local LiteLLM gateway | `~/.config/opencode/opencode.json` `mcp` | ✅ native | ❌ |
183
- | Vibe | `mistral-medium-3.5` | `~/.vibe/config.toml` `[[mcp_servers]]` | ✅ discovery + reads (writes flaky) | ❌ |
184
- | agy | — | — | ❌ headless cannot enable MCP | — |
185
- | letta cloud | Letta Cloud default | streamable-HTTP MCP URL (`/mcp add --transport http` + bearer) | ✅ remote (stdio rejected) | — |
186
- | letta (self-hosted ≤0.11.x) | `agent` group via local LiteLLM gateway | stdio via `PUT /v1/tools/mcp/servers` | ✅ native | — |
178
+ | **opencode** | (CLI default) | `~/.config/opencode/opencode.json` `mcp` | ✅ native | **prompts: ✅ (slash) · resources: ✅** — most complete ‖ |
179
+ | Codex | `gpt-5-codex` (OpenAI API) | `codex exec -c mcp_servers.*` | ✅ native | prompts: ❌ (no prompt meta-tools) · resources: ✅ (`read_mcp_resource`) ‖ |
180
+ | Kilocode | `kilo-auto/free` | global `settings/mcp_settings.json` | ✅ native | prompts: ❌ (no prompt mechanism) · resources: ✅ (`access_mcp_resource`) ‖ |
181
+ | Qwen | `agent` group via local LiteLLM gateway | project `.qwen/settings.json` | ✅ native (live invoke auth-blocked) | prompts: ✅ (slash `/summarize_spec`) · resources: ❌ (no client support) ‖ |
182
+ | Gemini | Google OAuth free tier (CLI default model) | project `.gemini/settings.json` `mcpServers` | ✅ native | prompts: interactive slash only · resources: interactive `@` only (neither reaches the model headless) ‖ |
183
+ | Vibe | `mistral-medium-3.5` | `~/.vibe/config.toml` `[[mcp_servers]]` | ✅ discovery + reads | prompts: ❌ · resources: ❌ (tools-only client) ‖ |
184
+ | agy | — | — | ❌ headless cannot enable MCP | n/a |
185
+ | letta (cloud / self-hosted) | Letta Cloud / `PUT /v1/tools/mcp/servers` | streamable-HTTP / stdio | ✅ (per prior sweep) | unknown — needs a running Letta server to test ‡ |
186
+
187
+ > **How to read the prompts/resources column.** MCP has three surfaces — tools, prompts,
188
+ > resources. **mcp-openapi-proxy serves all three, advertised by default since 0.3.0.**
189
+ > Whether they reach the model is up to the *client*, and that varies:
190
+ >
191
+ > - **‖ re-verified 2026-06-14 against the published 0.3.0 release** with **no** flags set
192
+ > (validating the default-on advertising), driving each **real client binary**.
193
+ > - **Tools** work on every client tested. **Prompts→model**: opencode & Qwen (slash
194
+ > commands); Gemini interactive-only. **Resources→model**: opencode, Codex, Kilocode.
195
+ > **opencode is the only client that surfaces all three.** Vibe is tools-only.
196
+ > - **‡ unknown** — Letta can't be exercised without standing up a Letta server + model;
197
+ > left untested rather than guessed.
198
+ > - Every cell on the proxy side was confirmed via a raw stdio handshake (`initialize`
199
+ > advertises tools+prompts+resources; `prompts/get` and `resources/read` return content).
200
+ > The remaining ❌ are **client-side** gaps, not proxy limitations.
201
+ >
202
+ > *(All pre-0.3.0 prompt/resource findings were voided — they were measured while
203
+ > advertising defaulted off, so they reflected the server default, not the clients.)*
187
204
 
188
205
  Minimal sanitized configs per client (the no-auth Glama spec is used as the smallest working example; substitute your own spec URL and `$YOUR_KEY` as needed):
189
206
 
@@ -153,15 +153,32 @@ The example configurations below were exercised against the live APIs, and the p
153
153
 
154
154
  | Agent CLI | Model used (live test) | MCP attach mechanism | Tool calls | Prompts/Resources surfaced to model? |
155
155
  |---|---|---|---|---|
156
- | Codex | `gpt-5-codex` (OpenAI API) | `codex exec -c mcp_servers.*` | ✅ native | ❌ (used raw stdio) |
157
- | Gemini | Google OAuth free tier (CLI default model) | project `.gemini/settings.json` `mcpServers` | ✅ native | ❌ interactive slash-commands only |
158
- | Qwen | `agent` group via local LiteLLM gateway | project `.qwen/settings.json` | ✅ native | ❌ NO_PROMPT_ACCESS |
159
- | Kilocode | `kilo-auto/free` | global `settings/mcp_settings.json`, clean workspace | ✅ native | ❌ |
160
- | opencode | `orchestration` group via local LiteLLM gateway | `~/.config/opencode/opencode.json` `mcp` | ✅ native | ❌ |
161
- | Vibe | `mistral-medium-3.5` | `~/.vibe/config.toml` `[[mcp_servers]]` | ✅ discovery + reads (writes flaky) | ❌ |
162
- | agy | — | — | ❌ headless cannot enable MCP | — |
163
- | letta cloud | Letta Cloud default | streamable-HTTP MCP URL (`/mcp add --transport http` + bearer) | ✅ remote (stdio rejected) | — |
164
- | letta (self-hosted ≤0.11.x) | `agent` group via local LiteLLM gateway | stdio via `PUT /v1/tools/mcp/servers` | ✅ native | — |
156
+ | **opencode** | (CLI default) | `~/.config/opencode/opencode.json` `mcp` | ✅ native | **prompts: ✅ (slash) · resources: ✅** — most complete ‖ |
157
+ | Codex | `gpt-5-codex` (OpenAI API) | `codex exec -c mcp_servers.*` | ✅ native | prompts: ❌ (no prompt meta-tools) · resources: ✅ (`read_mcp_resource`) ‖ |
158
+ | Kilocode | `kilo-auto/free` | global `settings/mcp_settings.json` | ✅ native | prompts: ❌ (no prompt mechanism) · resources: ✅ (`access_mcp_resource`) ‖ |
159
+ | Qwen | `agent` group via local LiteLLM gateway | project `.qwen/settings.json` | ✅ native (live invoke auth-blocked) | prompts: ✅ (slash `/summarize_spec`) · resources: ❌ (no client support) ‖ |
160
+ | Gemini | Google OAuth free tier (CLI default model) | project `.gemini/settings.json` `mcpServers` | ✅ native | prompts: interactive slash only · resources: interactive `@` only (neither reaches the model headless) ‖ |
161
+ | Vibe | `mistral-medium-3.5` | `~/.vibe/config.toml` `[[mcp_servers]]` | ✅ discovery + reads | prompts: ❌ · resources: ❌ (tools-only client) ‖ |
162
+ | agy | — | — | ❌ headless cannot enable MCP | n/a |
163
+ | letta (cloud / self-hosted) | Letta Cloud / `PUT /v1/tools/mcp/servers` | streamable-HTTP / stdio | ✅ (per prior sweep) | unknown — needs a running Letta server to test ‡ |
164
+
165
+ > **How to read the prompts/resources column.** MCP has three surfaces — tools, prompts,
166
+ > resources. **mcp-openapi-proxy serves all three, advertised by default since 0.3.0.**
167
+ > Whether they reach the model is up to the *client*, and that varies:
168
+ >
169
+ > - **‖ re-verified 2026-06-14 against the published 0.3.0 release** with **no** flags set
170
+ > (validating the default-on advertising), driving each **real client binary**.
171
+ > - **Tools** work on every client tested. **Prompts→model**: opencode & Qwen (slash
172
+ > commands); Gemini interactive-only. **Resources→model**: opencode, Codex, Kilocode.
173
+ > **opencode is the only client that surfaces all three.** Vibe is tools-only.
174
+ > - **‡ unknown** — Letta can't be exercised without standing up a Letta server + model;
175
+ > left untested rather than guessed.
176
+ > - Every cell on the proxy side was confirmed via a raw stdio handshake (`initialize`
177
+ > advertises tools+prompts+resources; `prompts/get` and `resources/read` return content).
178
+ > The remaining ❌ are **client-side** gaps, not proxy limitations.
179
+ >
180
+ > *(All pre-0.3.0 prompt/resource findings were voided — they were measured while
181
+ > advertising defaulted off, so they reflected the server default, not the clients.)*
165
182
 
166
183
  Minimal sanitized configs per client (the no-auth Glama spec is used as the smallest working example; substitute your own spec URL and `$YOUR_KEY` as needed):
167
184
 
@@ -14,8 +14,8 @@ Configuration is controlled via environment variables:
14
14
  - CAPABILITIES_RESOURCES: Set to "true" to enable resources advertising (default: false).
15
15
  - CAPABILITIES_PROMPTS: Set to "true" to enable prompts advertising (default: false).
16
16
  - ENABLE_TOOLS: Set to "false" to disable tools functionality (default: true).
17
- - ENABLE_RESOURCES: Set to "true" to enable resources functionality (default: false).
18
- - ENABLE_PROMPTS: Set to "true" to enable prompts functionality (default: false).
17
+ - ENABLE_RESOURCES: Set to "false" to disable resources functionality (default: true).
18
+ - ENABLE_PROMPTS: Set to "false" to disable prompts functionality (default: true).
19
19
  """
20
20
 
21
21
  import os
@@ -53,10 +53,13 @@ CAPABILITIES_TOOLS = os.getenv("CAPABILITIES_TOOLS", "false").lower() == "true"
53
53
  CAPABILITIES_RESOURCES = os.getenv("CAPABILITIES_RESOURCES", "false").lower() == "true"
54
54
  CAPABILITIES_PROMPTS = os.getenv("CAPABILITIES_PROMPTS", "false").lower() == "true"
55
55
 
56
- # Check feature enablement envvars (tools on, others off by default)
56
+ # Feature enablement (all on by default). Advertising a capability is
57
+ # required for clients to even attempt prompts/list & resources/list;
58
+ # defaulting these OFF made prompts/resources invisible to every client
59
+ # despite being implemented. Set to "false" to opt out.
57
60
  ENABLE_TOOLS = os.getenv("ENABLE_TOOLS", "true").lower() == "true"
58
- ENABLE_RESOURCES = os.getenv("ENABLE_RESOURCES", "false").lower() == "true"
59
- ENABLE_PROMPTS = os.getenv("ENABLE_PROMPTS", "false").lower() == "true"
61
+ ENABLE_RESOURCES = os.getenv("ENABLE_RESOURCES", "true").lower() == "true"
62
+ ENABLE_PROMPTS = os.getenv("ENABLE_PROMPTS", "true").lower() == "true"
60
63
 
61
64
  # Resource and prompt DEFINITIONS are always present so the feature is
62
65
  # deterministically testable. Whether they are EXPOSED to clients is gated
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-openapi-proxy
3
- Version: 0.2.1
3
+ Version: 0.3.1
4
4
  Summary: MCP server for exposing OpenAPI specifications as MCP tools.
5
5
  Author-email: Matthew Hand <11550632+matthewhand@users.noreply.github.com>
6
6
  Requires-Python: >=3.10
@@ -175,15 +175,32 @@ The example configurations below were exercised against the live APIs, and the p
175
175
 
176
176
  | Agent CLI | Model used (live test) | MCP attach mechanism | Tool calls | Prompts/Resources surfaced to model? |
177
177
  |---|---|---|---|---|
178
- | Codex | `gpt-5-codex` (OpenAI API) | `codex exec -c mcp_servers.*` | ✅ native | ❌ (used raw stdio) |
179
- | Gemini | Google OAuth free tier (CLI default model) | project `.gemini/settings.json` `mcpServers` | ✅ native | ❌ interactive slash-commands only |
180
- | Qwen | `agent` group via local LiteLLM gateway | project `.qwen/settings.json` | ✅ native | ❌ NO_PROMPT_ACCESS |
181
- | Kilocode | `kilo-auto/free` | global `settings/mcp_settings.json`, clean workspace | ✅ native | ❌ |
182
- | opencode | `orchestration` group via local LiteLLM gateway | `~/.config/opencode/opencode.json` `mcp` | ✅ native | ❌ |
183
- | Vibe | `mistral-medium-3.5` | `~/.vibe/config.toml` `[[mcp_servers]]` | ✅ discovery + reads (writes flaky) | ❌ |
184
- | agy | — | — | ❌ headless cannot enable MCP | — |
185
- | letta cloud | Letta Cloud default | streamable-HTTP MCP URL (`/mcp add --transport http` + bearer) | ✅ remote (stdio rejected) | — |
186
- | letta (self-hosted ≤0.11.x) | `agent` group via local LiteLLM gateway | stdio via `PUT /v1/tools/mcp/servers` | ✅ native | — |
178
+ | **opencode** | (CLI default) | `~/.config/opencode/opencode.json` `mcp` | ✅ native | **prompts: ✅ (slash) · resources: ✅** — most complete ‖ |
179
+ | Codex | `gpt-5-codex` (OpenAI API) | `codex exec -c mcp_servers.*` | ✅ native | prompts: ❌ (no prompt meta-tools) · resources: ✅ (`read_mcp_resource`) ‖ |
180
+ | Kilocode | `kilo-auto/free` | global `settings/mcp_settings.json` | ✅ native | prompts: ❌ (no prompt mechanism) · resources: ✅ (`access_mcp_resource`) ‖ |
181
+ | Qwen | `agent` group via local LiteLLM gateway | project `.qwen/settings.json` | ✅ native (live invoke auth-blocked) | prompts: ✅ (slash `/summarize_spec`) · resources: ❌ (no client support) ‖ |
182
+ | Gemini | Google OAuth free tier (CLI default model) | project `.gemini/settings.json` `mcpServers` | ✅ native | prompts: interactive slash only · resources: interactive `@` only (neither reaches the model headless) ‖ |
183
+ | Vibe | `mistral-medium-3.5` | `~/.vibe/config.toml` `[[mcp_servers]]` | ✅ discovery + reads | prompts: ❌ · resources: ❌ (tools-only client) ‖ |
184
+ | agy | — | — | ❌ headless cannot enable MCP | n/a |
185
+ | letta (cloud / self-hosted) | Letta Cloud / `PUT /v1/tools/mcp/servers` | streamable-HTTP / stdio | ✅ (per prior sweep) | unknown — needs a running Letta server to test ‡ |
186
+
187
+ > **How to read the prompts/resources column.** MCP has three surfaces — tools, prompts,
188
+ > resources. **mcp-openapi-proxy serves all three, advertised by default since 0.3.0.**
189
+ > Whether they reach the model is up to the *client*, and that varies:
190
+ >
191
+ > - **‖ re-verified 2026-06-14 against the published 0.3.0 release** with **no** flags set
192
+ > (validating the default-on advertising), driving each **real client binary**.
193
+ > - **Tools** work on every client tested. **Prompts→model**: opencode & Qwen (slash
194
+ > commands); Gemini interactive-only. **Resources→model**: opencode, Codex, Kilocode.
195
+ > **opencode is the only client that surfaces all three.** Vibe is tools-only.
196
+ > - **‡ unknown** — Letta can't be exercised without standing up a Letta server + model;
197
+ > left untested rather than guessed.
198
+ > - Every cell on the proxy side was confirmed via a raw stdio handshake (`initialize`
199
+ > advertises tools+prompts+resources; `prompts/get` and `resources/read` return content).
200
+ > The remaining ❌ are **client-side** gaps, not proxy limitations.
201
+ >
202
+ > *(All pre-0.3.0 prompt/resource findings were voided — they were measured while
203
+ > advertising defaulted off, so they reflected the server default, not the clients.)*
187
204
 
188
205
  Minimal sanitized configs per client (the no-auth Glama spec is used as the smallest working example; substitute your own spec URL and `$YOUR_KEY` as needed):
189
206
 
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "mcp-openapi-proxy"
7
7
  requires-python = ">=3.10"
8
- version = "0.2.1"
8
+ version = "0.3.1"
9
9
  description = "MCP server for exposing OpenAPI specifications as MCP tools."
10
10
  readme = "README.md"
11
11
  authors = [