Skip to content

Add @tiny-fish/mcp: local MCP proxy to agent.tinyfish.ai/mcp - #2

Merged
Zechereh merged 4 commits into
mainfrom
zach/tinyfish-mcp-init
Aug 3, 2026
Merged

Add @tiny-fish/mcp: local MCP proxy to agent.tinyfish.ai/mcp#2
Zechereh merged 4 commits into
mainfrom
zach/tinyfish-mcp-init

Conversation

@Zechereh

@Zechereh Zechereh commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Initial implementation of @tiny-fish/mcp — a locally-run MCP server distributed on npm that transparently reverse-proxies a local Streamable-HTTP endpoint (http://127.0.0.1:3711/mcp) to the hosted agent.tinyfish.ai/mcp, authenticating with TINYFISH_API_KEY.

  • No local tool definitionstools/list / tools/call are forwarded live, so parity with the hosted server is automatic (raw byte-pipe architecture; the MCP SDK's server transport was evaluated and rejected because it can't adopt upstream-issued session ids and diverges on framing/status codes).
  • Security: loopback-only bind, Origin allowlist (DNS-rebinding defense), server-holds-key model; inbound Authorization headers are never forwarded; the key never appears in logs or responses.
  • Streaming: run_web_automation SSE progress is relayed byte-verbatim with backpressure; client disconnect aborts the upstream fetch.
  • Errors: upstream JSON-RPC errors forward verbatim; locally-shaped errors for auth (-32001), unreachable/mid-stream death (-32000, with runId + "run may still be executing" guidance), and proxy bugs (-32603).
  • Tests: 156 unit tests offline against a faithful mock of the hosted /mcp

Test plan

  • npm run lint && npm run type-check && npm run build && npm test (156/156)
  • env -u TINYFISH_API_KEY npm run test:integration skips with notice
  • npm pack smoke test: tarball contains only dist/ + README + LICENSE + package.json; installed bin verified against the mock upstream

🤖 Generated with Claude Code

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 3, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Implemented @tiny-fish/mcp as a loopback Streamable HTTP MCP proxy. The package validates environment configuration, forwards authenticated JSON-RPC requests, bridges sessions and protocol versions, relays JSON and SSE responses, and handles cancellation and shutdown. The HTTP layer validates origins, routes /mcp and /healthz, and shapes errors. Tests cover configuration, transport, sessions, SSE, HTTP behavior, error handling, relay behavior, and hosted-upstream integration. CI and npm release workflows were added.

Sequence Diagram(s)

sequenceDiagram
  participant MCPClient
  participant HTTPServer
  participant MCPAdapter
  participant ProxyCore
  participant Upstream
  MCPClient->>HTTPServer: POST /mcp
  HTTPServer->>MCPAdapter: validate and parse request
  MCPAdapter->>ProxyCore: forward JSON-RPC message
  ProxyCore->>Upstream: authenticated request with session headers
  Upstream-->>ProxyCore: JSON or SSE response
  ProxyCore-->>MCPAdapter: response and stream events
  MCPAdapter-->>MCPClient: JSON response or relayed SSE
Loading
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly identifies the new @tiny-fish/mcp package and its local proxy to agent.tinyfish.ai/mcp.
Description check ✅ Passed The description accurately summarizes the proxy implementation, security controls, streaming behavior, errors, tests, and release process.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch zach/tinyfish-mcp-init

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (13)
.github/workflows/release.yml (1)

23-28: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Remove the npm cache from the publishing job.

cache: npm restores a cache whose key can be written by less privileged workflow runs. This job produces the published tarball and signs it with provenance, so a poisoned cache would be attested as trusted. Dependency install time is not critical for a tag release. Drop the cache here and keep it in ci.yml.

🔒 Proposed change
       - name: Setup Node.js
         uses: actions/setup-node@v4
         with:
           node-version: 22
-          cache: npm
           registry-url: https://registry.npmjs.org
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 23 - 28, Remove the cache: npm
setting from the Setup Node.js step in the publishing workflow, while retaining
the node-version and registry-url configuration. Leave npm caching enabled in
ci.yml.

Source: Linters/SAST tools

.github/workflows/ci.yml (1)

8-20: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Restrict the GITHUB_TOKEN permissions and stop credential persistence.

Neither job declares a permissions: block, so both jobs receive the default token scope. Both jobs only read the repository, build, and test. Add a workflow-level permissions: contents: read block. Also set persist-credentials: false on each actions/checkout step, because the checked-out .git/config otherwise keeps the token for the rest of the job.

🔒 Proposed hardening
 on:
   push:
     branches: [main]
   pull_request:
 
+permissions:
+  contents: read
+
 jobs:
   ci:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code
         uses: actions/checkout@v4
+        with:
+          persist-credentials: false

Apply the same persist-credentials: false addition to the checkout step at Lines 54-56.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 8 - 20, Add a workflow-level
permissions block granting only contents: read, and update every
actions/checkout step in the workflow—including the checkout near Lines
54-56—with persist-credentials set to false. Keep the existing job steps and
checkout behavior otherwise unchanged.

Source: Linters/SAST tools

tests/errors.test.ts (1)

455-464: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Close the ProxyCore after the test.

The test creates a ProxyCore and closes the mock upstream, but never calls core.closeAll(). The proxy keeps its session state and abort controllers for the aborted stream. Add the cleanup so this suite does not leave live handles for later files in the same worker.

♻️ Proposed cleanup
     } finally {
       vi.restoreAllMocks();
+      core.closeAll();
       await mock.close();
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/errors.test.ts` around lines 455 - 464, Update the test using the
`core` instance in the `logs the LocalWriteError and destroys the socket` case
to call `core.closeAll()` during cleanup, alongside the existing mock upstream
and spy cleanup, ensuring it runs even when the test assertion or handler fails.
tests/origin.test.ts (1)

19-33: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Optional: add two more denied/allowed cases.

Two behaviors that checkOrigin relies on are untested: uppercase host normalization and Node's comma-joined duplicate Origin header.

💚 Proposed additions
   const denied: string[] = [
     "https://evil.example.com",
+    // Node joins duplicate Origin headers with ", " — must not parse as loopback
+    "http://127.0.0.1:3711, http://evil.example.com",
     "http://evil.example.com:3711",
     "https://127.0.0.1:3711",
     "https://localhost:3711",
+    "http://LOCALHOST:3711", // URL parsing lowercases the hostname
   ];
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/origin.test.ts` around lines 19 - 33, Add test coverage in the
origin-checking cases around checkOrigin for uppercase host normalization and
duplicate Origin headers represented as Node’s comma-joined value, adding the
expected denied or allowed outcomes consistent with the existing origin policy.
tests/upstream.test.ts (1)

30-44: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Normalize recorded headers through Headers.

recordingFetch casts init.headers to Record<string, string> and reads it with Object.entries. UpstreamClient passes a plain object today, so the assertions work. If the client later passes a Headers instance or an array of pairs, Object.entries returns no entries and every header assertion in this suite passes without checking anything.

♻️ Proposed normalization
-      headers: Object.fromEntries(
-        Object.entries((init?.headers ?? {}) as Record<string, string>).map(([k, v]) => [
-          k.toLowerCase(),
-          v,
-        ])
-      ),
+      headers: Object.fromEntries(new Headers(init?.headers ?? {}).entries()),

Headers lowercases names already, so the downstream lookups stay unchanged.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/upstream.test.ts` around lines 30 - 44, Update the fetch mock’s header
recording in recordingFetch to normalize init.headers through the Headers API
before building call.headers. Preserve lowercase header names and ensure plain
objects, Headers instances, and arrays of pairs are all captured for downstream
assertions.
src/core/sse.ts (1)

96-108: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low value

Optional: bound the line buffer.

buffer grows without a limit until a newline arrives. An upstream that streams bytes without any newline makes the proxy accumulate the whole stream in memory. The current upstream is trusted, so this is defensive only. A cap that throws UpstreamProtocolError past a maximum line length would keep memory bounded.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/core/sse.ts` around lines 96 - 108, Bound the accumulated line data in
the SSE parsing loop around buffer and processLine: enforce a maximum line
length while no newline is received, and throw UpstreamProtocolError when the
limit is exceeded. Keep normal newline processing and CRLF handling unchanged,
using the existing error type and configuration conventions if available.
src/http/origin.ts (1)

1-25: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Optional: add a Host header allowlist as a second rebinding layer.

The Origin check blocks browser-driven DNS rebinding, because a rebound page sends its own origin. It does not cover a request that carries no Origin and a rebound Host such as attacker.example.com:3711. Such a request is allowed today. A Host allowlist limited to 127.0.0.1 and localhost on the bound port closes that path. The caller in src/http/index.ts (lines 34-58) is the natural place to apply both checks.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/http/origin.ts` around lines 1 - 25, Add a Host-header allowlist
alongside checkOrigin and apply both validations in the request handling flow in
the caller around the existing Origin check. Accept only localhost or 127.0.0.1
with the configured bound port, reject rebound or malformed Host values, and
preserve the current Origin behavior for requests without an Origin header.
src/core/errors.ts (1)

222-232: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Optional: exclude LocalWriteError from the upstream condition text.

LocalWriteError extends ProxyCoreError, so it matches this branch and produces "Upstream stream ended unexpectedly". Today src/http/adapter.ts (lines 162-268) returns early for LocalWriteError before calling toStreamErrorFrame, so the mislabel is unreachable. An explicit guard keeps the label correct if the adapter ordering changes.

♻️ Proposed defensive branch
     const condition =
       failure instanceof UpstreamAbortedError
         ? "The proxy aborted the upstream request mid-stream (local session closed or shutting down); "
-        : "Upstream stream ended unexpectedly before the final response; ";
+        : failure instanceof LocalWriteError
+          ? "Delivering the relayed stream to the local client failed; "
+          : "Upstream stream ended unexpectedly before the final response; ";
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/core/errors.ts` around lines 222 - 232, The condition text in the
ProxyCoreError handling branch should exclude LocalWriteError from the
upstream-stream-ended label. Update the condition near runHint and condition so
LocalWriteError receives an appropriate local-write classification, while
preserving the existing UpstreamAbortedError and other upstream failure
messages.
src/core/upstream.ts (1)

101-111: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add a pre-response upstream timeout.

Do not pass a live AbortSignal.timeout(...) to the returned SSE stream. Its later abort also terminates response-body consumption. Use a cancellable timer and clear it when fetch resolves. Keep options.signal active for the stream.

AbortSignal.timeout(...) produces TimeoutError; toTransportError currently maps it to UpstreamUnreachableError, not UpstreamAbortedError. Preserve that distinction from client cancellation.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/core/upstream.ts` around lines 101 - 111, Update the fetch flow around
the upstream request in the relevant method to use a cancellable pre-response
timer rather than passing AbortSignal.timeout directly to the returned SSE
stream. Combine the timer’s abort signal with options.signal for fetch, clear
the timer immediately after fetch resolves, and keep options.signal active for
response-body consumption. Preserve TimeoutError as the timeout-specific
transport error while continuing to map client cancellation distinctly through
toTransportError.
src/http/adapter.ts (1)

323-330: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add a maximum request body size to readBody.

readBody buffers the whole request body with no limit. Any local process that can reach 127.0.0.1:3711/mcp can stream an unbounded body and exhaust proxy memory. The Origin allowlist does not stop this, because checkOrigin accepts a missing Origin header (src/http/origin.ts:16).

Cap the buffered size and answer HTTP 413 when the cap is exceeded.

🛡️ Proposed limit
+const MAX_BODY_BYTES = 4 * 1024 * 1024;
+
 function readBody(req: IncomingMessage): Promise<Buffer> {
   return new Promise((resolve, reject) => {
     const chunks: Buffer[] = [];
-    req.on("data", (chunk: Buffer) => chunks.push(chunk));
+    let size = 0;
+    req.on("data", (chunk: Buffer) => {
+      size += chunk.length;
+      if (size > MAX_BODY_BYTES) {
+        reject(new BodyTooLargeError(MAX_BODY_BYTES));
+        req.destroy();
+        return;
+      }
+      chunks.push(chunk);
+    });
     req.on("end", () => resolve(Buffer.concat(chunks)));
     req.on("error", reject);
   });
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/http/adapter.ts` around lines 323 - 330, Update readBody to enforce a
maximum accumulated request-body size while buffering chunks, immediately stop
processing and reject when the limit is exceeded, and ensure the HTTP request
handler converts that condition into a 413 response. Preserve normal resolution
for bodies within the limit and avoid continuing to accumulate data after
rejection.
tests/helpers/mock-upstream.ts (1)

371-375: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Guard the fallback error write with res.headersSent.

streamAutomation writes the SSE headers before it streams frames. If anything throws after that point, this .catch calls jsonRpcError, which calls res.writeHead a second time. Node then throws ERR_HTTP_HEADERS_SENT inside the .catch callback, which surfaces as an unhandled rejection and can fail an unrelated test.

🛡️ Proposed guard
   const server = createServer((req, res) => {
     void handle(req, res).catch((err: unknown) => {
+      if (res.headersSent) {
+        res.destroy();
+        return;
+      }
       jsonRpcError(res, ErrorCodes.InternalError, `Internal server error: ${String(err)}`, -1);
     });
   });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/helpers/mock-upstream.ts` around lines 371 - 375, Update the catch
handler around handle in the createServer callback to call jsonRpcError only
when res.headersSent is false; otherwise avoid writing a second response after
SSE headers have been sent.
src/http/index.ts (1)

36-41: 🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Consider validating the Host header in addition to Origin.

checkOrigin returns true when the Origin header is absent (src/http/origin.ts:16). The loopback bind plus the Origin allowlist blocks browser-driven DNS rebinding, because browsers always send Origin on cross-origin requests. A Host allowlist (127.0.0.1:<port>, localhost:<port>) closes the remaining rebinding surface for clients that omit Origin.

This is a defense-in-depth suggestion, not an exploitable defect in the current design.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/http/index.ts` around lines 36 - 41, Validate the request Host header
alongside checkOrigin in the HTTP request handling flow before deriving
pathname. Allow only the configured loopback hosts (127.0.0.1 and localhost with
the server port), reject other or missing Host values with the existing
forbidden response, and preserve the current Origin validation behavior.
tests/session.test.ts (1)

78-85: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Harden hangingResponder against an already-aborted signal.

hangingResponder only rejects from the abort listener. If the signal is already aborted when the responder runs, the returned promise never settles and the test hangs instead of failing. Add an immediate check.

♻️ Proposed hardening
 function hangingResponder(): (call: RecordedCall) => Promise<Response> {
   return (call) =>
     new Promise<Response>((_resolve, reject) => {
+      const fail = (): void =>
+        reject(new DOMException("This operation was aborted", "AbortError"));
+      if (call.signal?.aborted === true) {
+        fail();
+        return;
+      }
-      call.signal?.addEventListener("abort", () =>
-        reject(new DOMException("This operation was aborted", "AbortError"))
-      );
+      call.signal?.addEventListener("abort", fail, { once: true });
     });
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/session.test.ts` around lines 78 - 85, Update hangingResponder to check
call.signal?.aborted immediately when creating the Promise and reject with the
existing AbortError behavior if already aborted, while retaining the abort event
listener for signals that abort later.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CHANGELOG.md`:
- Around line 9-20: Gate the release and usage documentation on PF-3214: in
CHANGELOG.md lines 9-20, keep version 0.1.0 under Unreleased or otherwise mark
the npm release as gated; in README.md lines 24-62, clearly label installation
and API-key usage as blocked or pre-release until the required upstream
authentication and surface-filtering dependency is available.

In `@README.md`:
- Around line 224-228: Before publishing 0.1.0, replace the TBD Owner and
Support policy entries in the README with the designated maintainer and public
support details. Remove the internal release-runbook reference and document the
publicly available issue-triage and release-support process instead.
- Around line 20-22: Add the text language identifier to the opening fenced code
blocks containing the agent.tinyfish.ai MCP URL and the corresponding block at
the second reported location, preserving their existing contents.

In `@src/config.ts`:
- Around line 41-59: Update the URL validation around the raw value and
isLoopback checks to reject URLs containing username or password credentials,
and replace both validation messages with generic errors that never include raw,
query, or credential data. Add a regression test covering a URL with embedded
secrets and assert the emitted configuration error excludes those secrets.

---

Nitpick comments:
In @.github/workflows/ci.yml:
- Around line 8-20: Add a workflow-level permissions block granting only
contents: read, and update every actions/checkout step in the workflow—including
the checkout near Lines 54-56—with persist-credentials set to false. Keep the
existing job steps and checkout behavior otherwise unchanged.

In @.github/workflows/release.yml:
- Around line 23-28: Remove the cache: npm setting from the Setup Node.js step
in the publishing workflow, while retaining the node-version and registry-url
configuration. Leave npm caching enabled in ci.yml.

In `@src/core/errors.ts`:
- Around line 222-232: The condition text in the ProxyCoreError handling branch
should exclude LocalWriteError from the upstream-stream-ended label. Update the
condition near runHint and condition so LocalWriteError receives an appropriate
local-write classification, while preserving the existing UpstreamAbortedError
and other upstream failure messages.

In `@src/core/sse.ts`:
- Around line 96-108: Bound the accumulated line data in the SSE parsing loop
around buffer and processLine: enforce a maximum line length while no newline is
received, and throw UpstreamProtocolError when the limit is exceeded. Keep
normal newline processing and CRLF handling unchanged, using the existing error
type and configuration conventions if available.

In `@src/core/upstream.ts`:
- Around line 101-111: Update the fetch flow around the upstream request in the
relevant method to use a cancellable pre-response timer rather than passing
AbortSignal.timeout directly to the returned SSE stream. Combine the timer’s
abort signal with options.signal for fetch, clear the timer immediately after
fetch resolves, and keep options.signal active for response-body consumption.
Preserve TimeoutError as the timeout-specific transport error while continuing
to map client cancellation distinctly through toTransportError.

In `@src/http/adapter.ts`:
- Around line 323-330: Update readBody to enforce a maximum accumulated
request-body size while buffering chunks, immediately stop processing and reject
when the limit is exceeded, and ensure the HTTP request handler converts that
condition into a 413 response. Preserve normal resolution for bodies within the
limit and avoid continuing to accumulate data after rejection.

In `@src/http/index.ts`:
- Around line 36-41: Validate the request Host header alongside checkOrigin in
the HTTP request handling flow before deriving pathname. Allow only the
configured loopback hosts (127.0.0.1 and localhost with the server port), reject
other or missing Host values with the existing forbidden response, and preserve
the current Origin validation behavior.

In `@src/http/origin.ts`:
- Around line 1-25: Add a Host-header allowlist alongside checkOrigin and apply
both validations in the request handling flow in the caller around the existing
Origin check. Accept only localhost or 127.0.0.1 with the configured bound port,
reject rebound or malformed Host values, and preserve the current Origin
behavior for requests without an Origin header.

In `@tests/errors.test.ts`:
- Around line 455-464: Update the test using the `core` instance in the `logs
the LocalWriteError and destroys the socket` case to call `core.closeAll()`
during cleanup, alongside the existing mock upstream and spy cleanup, ensuring
it runs even when the test assertion or handler fails.

In `@tests/helpers/mock-upstream.ts`:
- Around line 371-375: Update the catch handler around handle in the
createServer callback to call jsonRpcError only when res.headersSent is false;
otherwise avoid writing a second response after SSE headers have been sent.

In `@tests/origin.test.ts`:
- Around line 19-33: Add test coverage in the origin-checking cases around
checkOrigin for uppercase host normalization and duplicate Origin headers
represented as Node’s comma-joined value, adding the expected denied or allowed
outcomes consistent with the existing origin policy.

In `@tests/session.test.ts`:
- Around line 78-85: Update hangingResponder to check call.signal?.aborted
immediately when creating the Promise and reject with the existing AbortError
behavior if already aborted, while retaining the abort event listener for
signals that abort later.

In `@tests/upstream.test.ts`:
- Around line 30-44: Update the fetch mock’s header recording in recordingFetch
to normalize init.headers through the Headers API before building call.headers.
Preserve lowercase header names and ensure plain objects, Headers instances, and
arrays of pairs are all captured for downstream assertions.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f9269f1b-5408-4764-9b9c-fc296907dcc5

📥 Commits

Reviewing files that changed from the base of the PR and between 7c8ca34 and 7df45f0.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (38)
  • .editorconfig
  • .github/workflows/ci.yml
  • .github/workflows/release.yml
  • .gitignore
  • .prettierrc
  • CHANGELOG.md
  • LICENSE
  • README.md
  • eslint.config.js
  • package.json
  • src/config.ts
  • src/core/errors.ts
  • src/core/proxy-core.ts
  • src/core/session.ts
  • src/core/sse.ts
  • src/core/upstream.ts
  • src/http/adapter.ts
  • src/http/index.ts
  • src/http/origin.ts
  • src/index.ts
  • src/log.ts
  • src/shutdown.ts
  • src/version.ts
  • tests/adapter.test.ts
  • tests/config.test.ts
  • tests/errors.test.ts
  • tests/helpers/http.ts
  • tests/helpers/mock-upstream.ts
  • tests/origin.test.ts
  • tests/proxy.integration.test.ts
  • tests/relay.test.ts
  • tests/session.test.ts
  • tests/sse.test.ts
  • tests/upstream.test.ts
  • tsconfig.all.json
  • tsconfig.json
  • vitest.config.ts
  • vitest.integration.config.ts

Comment thread CHANGELOG.md
Comment thread README.md Outdated
Comment thread README.md Outdated
Comment thread src/config.ts
- Never echo TINYFISH_UPSTREAM_URL values in config errors; reject URLs
  with embedded credentials
- Remove internal doc/process references from code comments; trim comments
- Name maintainer in README; drop TBD support-policy section
- Keep 0.1.0 changes under Unreleased until first publish; mark README
  pre-release
- Add language identifiers to README fenced blocks

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Zechereh
Zechereh requested a review from KateZhang98 August 3, 2026 19:05
Zechereh and others added 2 commits August 3, 2026 16:39
fetch_content requires urls/format/links/image_links; run_web_automation
requires a client-minted session_id argument. Verified green against
sandbox now that /mcp accepts X-API-Key.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@Zechereh
Zechereh merged commit 4aa162d into main Aug 3, 2026
5 checks passed
@Zechereh
Zechereh deleted the zach/tinyfish-mcp-init branch August 3, 2026 23:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants