972 Commits

Author SHA1 Message Date
github-actions[bot] 6f42b66f3b chore(release): version packages (#3182)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@upstash/context7-mcp@4.1.0 mcpb-v4.1.0
2026-09-11 13:49:30 +03:00
Fahreddin Özcan 915abfe1e1 feat(mcp): add native OpenTelemetry observability (#3041)
* feat(mcp): add OpenTelemetry Prometheus metrics

* refactor(mcp): adopt native OpenTelemetry conventions

* feat(mcp): expand operational telemetry

* docs(mcp): define Envoy telemetry ownership

* perf(mcp): minimize telemetry overhead

* docs(mcp): clarify telemetry hard-off mode

* fix(mcp): make telemetry hard-off truly lazy

* fix(mcp): secure Prometheus bind defaults

* fix(mcp): harden telemetry lifecycle

* docs(mcp): document per-pod metrics scraping
2026-09-11 13:46:34 +03:00
Enes Gules ed2833d3ca docs: enable page feedback controls (#3172) 2026-09-09 14:33:33 -07:00
Fahreddin Özcan ec97797fdb fix(pnpm): classify ignored dependency builds (#3170) 2026-09-09 17:12:49 +03:00
github-actions[bot] c444389d7a chore(release): version packages (#3169)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@upstash/context7-mcp@4.0.7 mcpb-v4.0.7
2026-09-09 17:01:20 +03:00
Fahreddin Özcan 0087bab2dc fix(mcp): allow empty Claude plugin API key (#3168) 2026-09-09 17:00:14 +03:00
Fahreddin Özcan 19185e9a0d docs: add Cursor Cloud Agents setup guide (#3166)
* docs: add Cursor Cloud Agents setup guide

* docs: show verified Cursor Cloud result

* docs: address Cursor Cloud guide review
2026-09-09 15:49:34 +03:00
Enes Akar 9ab85544ed docs: restructure sidebar navigation into collapsible groups (#3163)
Reorganize the Context7 tab navigation and make every section
collapsible. Mintlify only honors `expanded` on nested groups, so each
tab's sections now live one level down under a wrapper group.

Navigation:
- Split the flat Overview and How To groups into Get Started, Libraries
  and Account
- Group library pages by Ownership and Configuration
- Merge the SDK and agentic tool trees into API and SDKs; Vercel AI SDK
  is now a sibling of TypeScript
- Collapse all sections by default except Get Started
- Remove group icons

Content:
- Rename agentic-tools/overview.mdx to agentic-tools.mdx, retitle it
  "Agentic Tools" and add a redirect from the old URL
- Drop the work-in-progress warning from the TypeScript SDK guide

No pages were added or removed.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-09 08:50:00 +03:00
github-actions[bot] d304ff2c08 chore(release): version packages (#3153)
* chore(release): version packages

* CTX7-2692: use patch versions for OIDC release

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Fahreddin Özcan <ozcanfahrettinn@gmail.com>
ctx7@0.5.11 @upstash/context7-tools-ai-sdk@1.0.1 @upstash/context7-sdk@0.4.1 @upstash/context7-mcp@4.0.6 mcpb-v4.0.6
2026-09-08 19:33:30 +03:00
Fahreddin Özcan e127fa124a CTX7-2006: Support on-premise setup in ctx7 CLI (#3044)
* CTX7-2006: feat(cli): support on-premise setup with base URL

* CTX7-2006: refactor(cli): isolate on-prem setup from outbound services

* CTX7-2006: feat(cli): prompt securely for on-prem API key

* CTX7-2006: test(cli): isolate on-prem API key scenarios

* CTX7-2006: fix(cli): harden on-premise setup

* CTX7-2006: refactor(cli): tighten on-premise setup boundaries

* CTX7-2006: fix(cli): address on-premise review feedback

* CTX7-2006: chore(cli): release setup support as patch
2026-09-08 18:21:17 +03:00
Fahreddin Özcan 5a7039bf9d CTX7-2692: Support Vercel Marketplace OIDC in SDK and MCP (#3145)
* CTX7-2692: support OIDC in SDK and MCP

* CTX7-2692: align Vercel OIDC with Marketplace spec

* CTX7-2692: fix MCP readme formatting

* CTX7-2692: prefer explicit OIDC credentials

* CTX7-2692: isolate OIDC authentication concerns

* CTX7-2692: address SDK and MCP review feedback
2026-09-08 16:19:42 +03:00
Ramazan Onur Acar 80e681a507 ctx7-2586 sanitize error responses for rejected request bodies (#3142)
* ctx7-2586 sanitize error responses for rejected request bodies

* ctx7-2586 scope the body error boundary and stop swallowing errors

* ctx7-2586 scope JSON parsing and its error boundary to the MCP router

* CTX7-2586: Add MCP error sanitization changeset

---------

Co-authored-by: Fahreddin Özcan <ozcanfahrettinn@gmail.com>
2026-09-07 16:06:33 +03:00
github-actions[bot] 620160bbd1 chore(release): version packages (#3144)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@upstash/context7-sdk@0.4.0
2026-09-07 11:55:19 +03:00
Enes Gules 6836bb4720 docs: document and enable Docs7 attribution (#3138) 2026-09-04 17:20:03 +03:00
Fahreddin Özcan 4eff2b90b9 feat(sdk): add production HTTP controls and fix review findings (#3137)
* ctx7-2663: address SDK review findings

* ctx7-2663: tighten SDK test architecture

* ctx7-2663: address SDK type review

* feat(sdk): add production HTTP controls

* refactor(sdk): align HTTP conventions with redis-js

* refactor(sdk): decompose HTTP transport

* refactor(sdk): tighten retry API

* ctx7-2663: address latest SDK review
2026-09-04 16:43:56 +03:00
github-actions[bot] a37d30cf14 chore(release): version packages (#3102)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@upstash/context7-mcp@4.0.5 ctx7@0.5.10 mcpb-v4.0.5
2026-09-04 13:11:53 +03:00
Enes Gules 21c3dd464e feat(mcp): authenticate and track Claude Code plugin (#3028)
* feat(mcp): require auth on /mcp when client is a plugin

Plugin hosts such as Claude Code only start OAuth for servers that 401 at
connect time. Matching Exa MCP, ?client=claude-code-plugin (any client
value containing "plugin") now gates /mcp the same way /mcp/oauth does,
while anonymous access on the public URL is unchanged.

Co-authored-by: Enes Gules <enesgules@users.noreply.github.com>

* chore(mcp): drop the SDK OAuth-helpers TODO

The v2 helpers (bearerAuthChallengeResponse, oauthMetadataResponse) assume
Bearer-only OAuth on a fetch() handler. This server also accepts API keys,
mixes anonymous and required routes, returns JSON-RPC 401 bodies, and
proxies authorization-server metadata live, so they are not a drop-in.

Co-authored-by: Enes Gules <enesgules@users.noreply.github.com>

* docs: keep the plugin client auth gate out of user-facing docs

The ?client=claude-code-plugin gate stays in the server and Claude plugin
URL. OAuth docs continue to describe /mcp/oauth only.

Co-authored-by: Enes Gules <enesgules@users.noreply.github.com>

* simplify Claude plugin auth tracking

* separate plugin and client metrics

* extract plugin request detection

* simplify MCP request handling

* extract authentication policy

* use OAuth for Claude Code plugin

* support API key or OAuth in Claude plugin

* simplify Claude plugin authentication

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Enes Gules <enesgules@users.noreply.github.com>
Co-authored-by: Fahreddin Özcan <ozcanfahrettinn@gmail.com>
2026-09-04 11:44:54 +03:00
Enes Gules 6d777619c2 Add Docs7 documentation and component guides (#3024)
Co-authored-by: Context7 Agent <docs-agent@context7.com>
Co-authored-by: Josh <josh@upstash.com>
Co-authored-by: context7[bot] <236830434+context7[bot]@users.noreply.github.com>
2026-09-02 18:14:37 +03:00
Fahreddin Özcan d451757811 feat(cli): add GitHub Copilot CLI setup target (#3092) 2026-09-02 14:02:45 +03:00
Fahreddin Özcan ea19d322e7 feat(cli): add Devin setup target (#3090) 2026-09-02 13:54:15 +03:00
Fahreddin Özcan a871e7e79e feat(cli): add VS Code setup target (#3089)
* feat(cli): add VS Code setup target

* refactor(cli): harden setup target registry
2026-09-02 13:41:48 +03:00
Enes Gules c05c71c5fd feat: rebuild mcpb packaging as a self-contained bundle, publish on release (#3099) 2026-09-01 16:13:47 +03:00
Fahreddin Özcan 76140fc358 fix(cli): reuse device login API key during setup (#3109) 2026-08-31 16:49:47 +03:00
Fahreddin Özcan 2a851fcd1e fix(mcp): remove legacy client IP encryption (#3112) 2026-08-31 14:18:30 +03:00
Fahreddin Özcan 4e980f6b49 fix(mcp): increase HTTP subscription capacity (#3101)
* fix(mcp): increase HTTP subscription capacity

* fix(mcp): use benchmarked subscription capacity

* fix(mcp): set subscription ceiling to 24k

* fix(mcp): start subscription ceiling at 16k

* fix(mcp): clarify subscription limit safeguards
2026-08-28 15:51:39 +03:00
github-actions[bot] edc9eeb77b chore(release): version packages (#3094)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@upstash/context7-mcp@4.0.4
2026-08-28 12:57:35 +03:00
Fahreddin Özcan 794cc6ba25 fix(mcp): authenticate forwarded client IP assertions (#3088)
* fix(mcp): sign forwarded client IP assertions

* fix(mcp): trust proxy-derived client addresses

* fix(mcp): preserve legacy rollout key

* fix(mcp): validate asserted client addresses

* fix(mcp): retain CGNAT proxy support
mcpb-v4.0.3
2026-08-28 12:38:38 +03:00
Enes Gules 0e96f6ebcf fix: repair MCP Registry publishing and automate it on release (#3097) 2026-08-28 12:16:10 +03:00
Fahreddin Özcan 8fa6c6b9d2 fix(mcp): honor advertised X-Context7-API-Key header (#3091)
* fix(mcp): honor advertised API key header (CTX7-2534)

* chore: add changeset for MCP API key header
2026-08-27 12:43:23 +03:00
github-actions[bot] 0ff958c9f0 chore(release): version packages (#3084)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
ctx7@0.5.9
2026-08-27 11:20:55 +03:00
Fahreddin Özcan 3abc99a5cf fix(cli): recover Scoop Git Bash library IDs (#3085)
* fix(cli): recover Scoop Git Bash library IDs

* fix(cli): handle unresolved Scoop current path
2026-08-27 11:14:34 +03:00
Fahreddin Özcan 9a384f0990 Add automatic repository update documentation (#3077)
* Add automatic repository update guide

* Clarify automatic update provider support
2026-08-26 15:23:57 +03:00
Fahreddin Özcan 118c8528e4 fix(cli): safely patch Codex TOML stdio args (#3075)
* fix(cli): safely patch Codex TOML stdio args

* test(cli): validate TOML editor across 60 configs

* fix(cli): reject unsafe Codex TOML updates
2026-08-26 15:13:35 +03:00
Enes Gules 63a40c6a6a docs: add Intercom chat (#3067) 2026-08-24 11:37:11 +03:00
Enes Gules c3248289c2 Add context7.json with URL and public key (#3057) 2026-08-21 10:59:33 +03:00
github-actions[bot] 05796c7425 chore(release): version packages (#3053)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@upstash/context7-mcp@4.0.3
2026-08-21 10:55:43 +03:00
Fahreddin Özcan 769c6cd22c chore(mcp): add OAuth issuer changeset (#3052) 2026-08-20 13:12:12 +03:00
Fahreddin Özcan 7d877a46f2 fix(mcp): advertise Clerk as OAuth issuer (#3050)
* fix(mcp): advertise Clerk as OAuth issuer

* docs(mcp): clarify OAuth issuer configuration

* align oauth discovery and verification
2026-08-20 12:28:38 +03:00
Fahreddin Özcan 5284672feb docs(opencode): document plugin OAuth command (#3049) 2026-08-18 16:50:09 +03:00
github-actions[bot] 505d9d7cc4 chore(release): version packages (#3048)
* chore(release): version packages

* fix(release): publish OpenCode plugin at 0.1.0

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Fahreddin Özcan <ozcanfahrettinn@gmail.com>
@upstash/context7-opencode@0.1.0
2026-08-18 15:27:04 +03:00
Fahreddin Özcan 07580f10af feat(plugins): add Context7 plugin for OpenCode (#3008)
* feat(plugins): add Context7 plugin for OpenCode

Adds @upstash/context7-opencode, an OpenCode plugin that registers the
hosted Context7 MCP server, the context7-mcp skill, a docs-researcher
subagent, and the /context7-docs command through the config hook.

* docs(opencode): keep ctx7 setup as the primary install path

* refactor(opencode): drop the component toggles and tighten the option boundary

The skill/agent/command toggles were speculative: OpenCode dedupes skills by
name, so running ctx7 setup alongside the plugin is already safe, and a user
who wants a component gone can define it themselves, which the plugin never
overwrites. Removing them collapses resolveOptions into resolveApiKey and
deletes the duplicated defaulting between option parsing and config assembly.

Also assert the MCP endpoints as literals. The tests compared against the same
constants they exercised, so a wrong URL would have passed.

* refactor(opencode): drop tests and collapse the plugin into one file

config.ts existed to give the tests a seam. With the tests gone the split was
indirection with no consumer, so the constants, the config assembly, and the
plugin entry now live in src/index.ts and nothing but the default export is
public. Passing skillsDir through an ApplyInput object also stops being
necessary once it is a module constant.

* fix(opencode): run the MCP server over stdio and drop the slash command

Verified against a real OpenCode 1.18.11 session: the remote transport does
not work. OpenCode opens the optional GET SSE stream, mcp.context7.com answers
405, and OpenCode marks the server failed and registers no tools, so the model
never sees resolve-library-id and falls back to inventing bash calls. A control
project with a plain remote mcp block and no plugin fails the same way, so this
is not plugin-specific. Running the server over stdio connects and the model
calls the tools.

The bundled skill and the agent prompt also referenced the bare tool names.
OpenCode prefixes MCP tools with the server name, so they are now
context7_resolve-library-id and context7_query-docs.

Also removes the /context7-docs command. The skill already triggers on its own
and the subagent covers focused lookups.

* refactor(opencode): use the remote MCP server and drop the subagent

The plugin now adds two things: the hosted MCP server over the remote
transport, and the context7-mcp skill.

Known limitation: OpenCode opens the optional GET SSE stream on the endpoint
and mcp.context7.com answers 405, so OpenCode marks the server failed and
registers no tools. Reproduced on 1.18.11 and 1.18.16, and with a plain remote
mcp block and no plugin, so it is not plugin-specific. It resolves once
mcp.context7.com answers GET /mcp with a 200 SSE stream instead of 405.

* refactor(opencode): ship the canonical skill verbatim and drop the phantom peer dep

The bundled skill had been edited to hard-code OpenCode's context7_ tool
prefix. That divergence was unnecessary and counterproductive:

- It was fixing a misdiagnosis. The model only invented shell commands when
  the MCP server had failed to connect and no context7 tools existed at all.
  With the tools present, claude-haiku-4-5 calls context7_resolve-library-id
  correctly from the bare-name canonical skill.
- It was defeated where it mattered. OpenCode dedupes skills by name and scans
  ~/.claude/skills first, so on any machine that ran ctx7 setup the bundled
  copy is shadowed by the canonical one anyway.
- It was the only client copy to diverge in content. claude, copilot, codex
  and cursor all ship skills/context7-mcp/SKILL.md verbatim, and there is no
  tooling to keep copies in sync.

Also removes peerDependencies on @opencode-ai/plugin. The package is a
type-only import that the build erases, so the published dist has zero
references to it, and peerDependenciesMeta.optional made the declaration inert
anyway. The devDependency is what typechecking actually needs.

* refactor(opencode): strip commentary and inline the plugin function

Keeps only the two comments that stop someone breaking the plugin: why the
skills cast is needed, and why nothing but the default export may be exported.

Inlining the server function into the default export drops the Context7Plugin
binding and the Plugin type import, since satisfies PluginModule already types
the callback. 85 lines down to 56.

* docs(opencode): use the prefixed tool names consistently in the README
2026-08-18 15:20:43 +03:00
Fahreddin Özcan f3a818d69d docs: add OpenClaw installation guide (#3045)
* docs: add OpenClaw installation guide

* docs: recommend OAuth for OpenClaw
2026-08-17 15:16:22 +03:00
Fahreddin Özcan d27c0f1bf8 docs: add eve integration guide (#3038) 2026-08-15 17:42:43 +03:00
Fahreddin Özcan 0e3298e643 docs: add Gerrit integration guide (#3035)
* docs: add Gerrit integration guide

* docs: clarify Gerrit host configuration

* docs: add Gerrit setup screenshots
2026-08-14 15:23:20 +03:00
Fahreddin Özcan a7e38a052a CTX7-1984: Update private parsing pricing docs (#3034)
* CTX7-1984 update private parsing pricing docs

* CTX7-1984 keep docs price references unchanged
2026-08-14 15:01:44 +03:00
Fahreddin Özcan 7274d720fb ci: use OIDC for Bedrock tests (#3031) 2026-08-13 15:15:49 +03:00
Fahreddin Özcan 449bc6c700 ci: use OIDC for ECR deployment (#3029)
* ci: use OIDC for ECR deployment

* ci: keep AWS identifiers in secrets
2026-08-13 14:38:34 +03:00
Fahreddin Özcan ca15df0443 docs: correct non-root image version floor to 1.3.2 (#3014) 2026-08-12 14:37:43 +03:00
github-actions[bot] ef14a58dfe chore(release): version packages (#3021)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@upstash/context7-mcp@4.0.2
2026-08-11 19:29:38 +03:00
Fahreddin Özcan c68104e52c Disable SSE keepalives so hung exchanges are reapable (#3019)
Root cause of the 2026-08-11 stream leak, reproduced deterministically: a
2025-era JSON-RPC batch carrying a request plus notifications/cancelled
for that same request never terminates. Per spec a cancelled request gets
no response, but the SDK's legacy stateless transport only closes the
POST's SSE stream once every request in it has been answered — so the
exchange hangs. The 15s keepalive heartbeats then kept the hung stream
"active" forever: no proxy idle timeout could fire, and only the
gateway's 1200s hard cap reaped it. v1 hung on the same batch but sent
no keepalives, so proxy idle timeouts self-healed it within the hour —
which is why the leak only became an outage with v2.

Fix: keepAliveMs: 0. No legitimate exchange here needs a heartbeat (the
tools are millisecond vector queries, p100 ~28s, zero requests over 30s
in 62.7M/day), so the only streams keepalives were keeping alive were
dead ones. Hung exchanges now go silent and the gateway reaps them at
streamIdleTimeout (300s, deployed in context7parser#655) instead of
accumulating for 1200s. This covers the whole class of silent hangs, not
just the cancellation shape.

Validated:
- cancel-batch hang emits 0 bytes over 35s (was: keepalive every 15s);
  gateway idle-reap of silent streams was proven separately on a local
  Envoy Gateway v1.8.1 (silent stream cut at the idle timeout,
  heartbeating stream never)
- tools/call, [req,req] batches, modern-era requests all unchanged
- typecheck, eslint, prettier clean

The SDK accounting bug (cancelled requests should count as settled for
stream close) remains to be filed upstream.
2026-08-11 19:26:33 +03:00