Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

add Effect-native McpClient

Open
#8,912 2 comments 1 reaction 0 assignees View on GitHub

Maintainers usually reply within 1 day

@lloydrichards is already working on this.

Since Oct 6, 2026.

  • #8862 by @lloydrichards — open

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
8/100
Issue type
Feature
Clarity
Needs clarification
Activity status
Active
Tech stack
typescript
Domain
api

Research direction

This is a large design-level feature, not a starter task. Before any code, read the linked open pull request #8862 and the existing McpServer implementation the issue refers to, to see what is already in flight. The issue proposes trimming the first deliverable to transports, legacy and modern protocols, and tool, prompt and resource discovery, but the maintainers have not agreed on that scope yet. Done means an agreed scope and design, not a patch.

Written by the indexing model from the issue text.

Description

enhancement
What is the problem this feature would solve?

At the moment Effect only has an McpServer implementation which means we can only offer part of the stack. There are already a lot of effect harnesses that need to either use the @modelcontextprotocol sdk or roll their own version. Since Effect already has a lot of the Schema implementation setup, it would benefit greatly from being able to reuse to build out the McpClient as well.

What is the feature you are proposing to solve the problem?

Add an MCP client that lets Effect applications discover server capabilities, use tools, access prompts and resources, and handle interactive requests. The full requirement would cover both legacy and modern protocols over stdio and Streamable HTTP.

flowchart LR
  Server[McpServer] <--> Client[McpClient]
  Client --> Toolcall[Toolcall] --> Direct(Application workflow)
  Client --> Toolkit[Toolkit] --> Model[LanguageModel] --> Agent(Agent workflow)
  Client --> Prompt[Prompt] --> Direct
  Client --> Resource[Resource] --> Direct
  Client --> Subscription[Subscription] --> Direct

Tools

  • Discover tools, preserving schemas, annotations, and metadata.
  • Call a discovered tool and retain its complete result, including content, structured output, and isError.
  • Decode structured output with a caller-provided Effect schema.
  • Adapt discovered tools through the standard Tool and Toolkit APIs.

Prompts

  • List available prompts. Retrieve a prompt with its arguments.
  • Preserve message roles, content, and metadata.

Resources

  • List resources and resource templates. Read a resource by URI.
  • Preserve text, binary content, MIME types, and metadata.

Subscriptions

  • Observe tool, prompt, and resource list changes where the selected protocol supports them. Subscribe to resource updates where supported.
  • Expose notifications through scoped streams with bounded buffering.
  • Release subscriptions when their scope closes.

Elicitation

  • Let applications supply Effect handlers for server requests for user input.
  • Support form and URL elicitation where the selected revision permits them.
  • Represent acceptance, rejection, and cancellation explicitly.
Keep it reasonably simple

Adding all this at once will be a complex and heavy PR so I would trim back the first deliverable to to just the transport layers, legacy/modern protocols, and tools / prompts / resource discovery. I think adding the subscription and elicitation in the first pass will complicate things with the lifecycle so should be addressed in a follow up.

Dominant language
TypeScript
Stars
16.7k
Forks
808
Avg merge
10h 14m
Merged PRs (30d)
518

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Effect-TS/effect

All issues in Effect-TS/effect

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.