Skip to content

feat(mcp): add EvoLink media generation server - #2456

Merged
zerob13 merged 2 commits into
ThinkInAIXYZ:devfrom
Evolink:feat/evolink-mcp-server
Oct 24, 2026
Merged

zerob13 merged 2 commits into
ThinkInAIXYZ:devfrom
Evolink:feat/evolink-mcp-server

Conversation

@Evolink

@Evolink Evolink commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Sign-in needs the fix for #2455. With current DeepChat, OAuth sign-in to this server cannot finish: the code exchange fails because of the issuer comparison described there. The entry ships disabled, so merging it before that fix is fine with us; please don't announce it as working until #2455 is fixed.

Disclosure: I work at EvoLink (https://evolink.ai), the provider added by this PR. It comes from the EvoLink company GitHub account.

Summary

Adds evolink to DEFAULT_MCP_SERVERS as a built-in HTTP MCP server that ships disabled.

EvoLink is a media generation API with 150+ image, video, music and speech models. The hosted endpoint https://mcp.evolink.ai/mcp (streamable HTTP) has 16 tools: model search, published prices and cost quotes, image/video/audio generation, task status, balance, and uploads for reference media. Sign-in is OAuth 2.1 with dynamic client registration and PKCE (S256), with no API key, so the entry has no customHeaders and DeepChat's interactive OAuth handles sign-in through the Authenticate button. It would be the first built-in entry that signs in with OAuth.

The entry follows the skyaccess-empty-legs and cohesivity shape (type: 'http' plus baseUrl). It is appended after keenable-search and is not in DEFAULT_ENABLED_SERVER_NAMES, so it is listed but off. No existing entry, default or ordering changes.

Costs: model search, prices, quotes, task status and balance checks are free. generate_image, generate_video and generate_audio charge the signed-in user's EvoLink balance; the server's instructions ask the assistant to show a quote and wait for the user's approval before each paid task.

What is sent to EvoLink once a user enables it and signs in: the prompts and parameters of the tasks the model requests, reference media URLs or uploaded files, and task IDs for status checks.

Two files, 28 added lines, no dependencies.

Testing

pnpm run format:check   All matched files use the correct format (3118 files)
pnpm run lint           alert-dialog guard passed; oxlint: 0 warnings, 0 errors; exit 0
pnpm run typecheck      typecheck:node and typecheck:web: exit 0
vitest test/main/mcp    17 files, 256 tests passed (settings.test.ts: 15 passed)
pnpm exec commitlint --from origin/dev --to HEAD: exit 0

The new case in test/main/mcp/settings.test.ts mirrors the Keenable case: an existing user with an empty mcpServers store picks up the entry on upgrade with enabled: false and no custom headers, so isRemoteOAuthCapable treats it as an interactive OAuth server.

Live check through the app's own code path: a throwaway Vitest file (not committed) ran McpOAuthManager.startAuth against the real endpoint with shell.openExternal stubbed, then requested the authorization URL without following redirects and sent a callback with a fake code to DeepChat's loopback server:

discovery      : protected-resource metadata -> issuer https://passport.evolink.ai
registration   : DCR created a "DeepChat" client; PKCE S256, scope "mcp offline_access",
                 resource https://mcp.evolink.ai/mcp, redirect http://localhost:1456/mcp/oauth/callback/<random>
authorize URL  : 302 to EvoLink's sign-in page
code exchange  : "Existing OAuth client information is required when exchanging an authorization code" (#2455);
                 with the patch in #2455 the fake code reaches the token endpoint and is rejected as expected

#2455 also describes a second problem that appears after that fix: retrying after an unfinished sign-in reuses the client with a new random callback path. Logging out of the server and authenticating again works around it.

To try it once #2455 is fixed: enable the server, click Authenticate, sign in or create an EvoLink account, then call check_balance or search_models; both are free.

No renderer strings were added, so pnpm run i18n is not needed.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added EvoLink as an HTTP MCP server option at https://mcp.evolink.ai/mcp, with browser-based OAuth sign-in and no API key required.

Adds EvoLink's hosted MCP server (https://mcp.evolink.ai/mcp) as a
built-in HTTP entry that ships disabled. It signs in with OAuth, so the
entry has no custom headers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5666d260-740c-45a7-897a-a484a0c63bb9
📥 Commits

Reviewing files that changed from the base of the PR and between 3a5c205 and 5141a96.

📒 Files selected for processing: 1
  • src/main/mcp/settings.ts
🚧 Files skipped from review as they are similar to previous changes: 1
  • src/main/mcp/settings.ts

Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 7 remain after this review.

📝 Walkthrough

The default MCP server configuration adds EvoLink at https://mcp.evolink.ai/mcp. A test checks that getMcpServers() returns it as disabled and without custom headers.

Changes: EvoLink MCP server

Layer / File(s) Summary
Add and verify EvoLink configuration
src/main/mcp/settings.ts, test/main/mcp/settings.test.ts
The default configuration adds EvoLink as an HTTP server. The test checks that getMcpServers() returns it as disabled, with no custom headers.

Priority: ➖ Normal

Estimated code review effort: 1 (Trivial) | ~4 minutes

Change: Feature

Possibly related PRs

Suggested reviewers: zerob13

Merge Risk: ⚪ Minimal · up to 5141a

EvoLink is added disabled, so it will not connect automatically. The reported sign-in issue has not been confirmed from the available evidence; validate sign-in before announcing the integration as working.

Pre-merge checks: Passed 5
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely describes the main change: adding an EvoLink media-generation MCP server.
Docstring Coverage Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 2…
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.
Full details: Docstring Coverage

Explanation

No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 2 files.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@zerob13 zerob13 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Adds EvoLink as a disabled built-in HTTP MCP preset. The shape matches the existing presets, the upgrade path works, and the settings suite passes locally. One change needed before merge.

Remove the tracking parameters from the docs link

The description is rendered in the MCP settings card, so this URL is user-visible:

https://evolink.ai/mcp?utm_source=deepchat&utm_medium=referral&utm_campaign=mcp_remote&utm_content=directory_listing

No other built-in entry ships attribution parameters in its description; they link to plain documentation URLs (https://docs.keenable.ai, https://serply.io/docs, the SkyAccess GitHub repo). A referral-tagged URL in product copy is tracking, not documentation. Please use https://evolink.ai/mcp.

Merge order: #2455 is a bug report, not a fix

The PR text says this depends on #2455. #2455 is an open issue about OAuth code exchange failing when the issuer has no trailing slash, not a pull request, so nothing will land to unblock this automatically. The entry is still safe to merge on its own: it ships disabled and existing users only gain an unchecked list item. But sign-in cannot complete until that bug is fixed. Wait for the fix PR, or record the release dependency so this preset is not announced as working before it is.

The rest is fine

  • Scope: one preset plus one upgrade test. No new provider class, no abstraction, no dependency, no edits to existing entries.
  • Defaults: appended after keenable-search and not in DEFAULT_ENABLED_SERVER_NAMES, so it ships disabled. The new test asserts exactly that for an existing user with an empty store.
  • No customHeaders is correct for this server. isRemoteOAuthCapable treats an HTTP server without an Authorization header as interactive OAuth, and the endpoint answers initialize with 401 plus valid protected-resource metadata.
  • Description: billing and the free operations are stated before the user enables it. Good.
  • Tests: one test following the same pattern as the SkyAccess, Cohesivity and Keenable cases. Not excessive.
  • No breaking or destructive change: +28/−0 across two files.

Verification at head 3a5c2054: isolated worktree; vitest run test/main/mcp/settings.test.ts 15/15 passed; oxfmt --check and oxlint clean on both changed files; POST initialize to https://mcp.evolink.ai/mcp returned 401 and /.well-known/oauth-protected-resource returned 200. Node typecheck did not finish cleanly in this environment because the workspace package acp-extension-core is missing, which is unrelated to these files, so I am not counting it as verification.

Review details
  • Head reviewed: 3a5c2054889fec348f57ed106ba0436c5c27df90
  • Base: dev at b10443ab7ed7e55c2cd18c8919a6a124d2b978c3
  • Diff: src/main/mcp/settings.ts +11, test/main/mcp/settings.test.ts +17
  • CI: PR Check and Package Check were waiting for first-time-contributor approval; they are running now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Evolink

Evolink commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the review. I removed the tracking parameters: the description now links to https://evolink.ai/mcp (5141a96). oxfmt --check, oxlint, settings.test.ts (15/15) and commitlint pass.

On merge order, either way works for us. The entry ships disabled, so it can go in before the fix as long as it isn't announced as working until #2455 is fixed. I've updated the PR description to say that. We're happy to test a fix for #2455 against our server whenever it's ready.

@zerob13 zerob13 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The requested change is in. Approving; merge once CI passes.

What changed

The docs link in the MCP settings card now points to https://evolink.ai/mcp. The tracking parameters are gone. That is the only code change since the last review (5141a96).

What still applies

  • The preset ships disabled and is appended after keenable-search, so the upgrade only adds an unchecked entry. No existing behavior moves.
  • Browser sign-in for this server still depends on the OAuth issuer fix in #2455. The PR description now says that plainly, which is the right way to ship a preset that cannot be used until the fix lands. Do not present it as working before then.
  • I approved the two first-time-contributor workflow runs at this head; PR Check and Package Check are queued.

Verification

  • pnpm exec vitest run --config vitest.config.ts test/main/mcp/settings.test.ts → 15/15 passed.
  • oxfmt --check and oxlint clean on src/main/mcp/settings.ts.
  • Full PR diff vs dev: +28/−0 across src/main/mcp/settings.ts and test/main/mcp/settings.test.ts. One preset plus one upgrade test; no new abstraction, dependency, or edits to other entries.
Review details
  • Head reviewed: 5141a96cccb3f665fb90655afb54f3fb1b065b26
  • Previous review: 3a5c2054889fec348f57ed106ba0436c5c27df90 (changes requested for the tracking URL)
  • Delta: one line in src/main/mcp/settings.ts
  • Review scope: isolated worktree at the PR head; the main working tree was not touched.

@zerob13
zerob13 merged commit 0507b76 into ThinkInAIXYZ:dev Oct 24, 2026
12 checks passed
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