Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🔧 feat: Initial MCP Support (Tools) #5015

Merged
merged 53 commits into from
Dec 17, 2024
Merged

🔧 feat: Initial MCP Support (Tools) #5015

merged 53 commits into from
Dec 17, 2024

Conversation

danny-avila
Copy link
Owner

@danny-avila danny-avila commented Dec 17, 2024

Summary

Initial Support for MCP, integrating tools to start, I will then move on to Resources, then Prompts.

Initial tool support is for Agents and Assistants API endpoints.

Note: Agents are recommended due to the ability to provide images from tool results directly to the LLM (Anthropic/OpenAI only).

Relevant issue: #4876

Change Type

  • New feature (non-breaking change which adds functionality)

Testing

Tested the following mcpServers config via librechat.yaml file:

# librechat.yaml
mcpServers:
  everything:
      # type: sse # type can optionally be omitted
      url: http://localhost:3001/sse
  puppeteer:
    type: stdio
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-puppeteer"
  filesystem:
    # type: stdio
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-filesystem"
      - /home/danny/LibreChat/
# `iconPath` - unique to LibreChat, defines the tool's display icon shown 
# in the tool selection dialog, opened by "Add Tools" from Agents form
    iconPath: /home/danny/LibreChat/client/public/assets/logo.svg
  mcp-obsidian:
    command: npx
    args:
      - -y
      - "mcp-obsidian"
      - /mnt/c/Users/danny/Documents/obsidian

Checklist

  • My code adheres to this project's style guidelines
  • I have performed a self-review of my own code
  • I have commented in any complex areas of my code
  • I have made pertinent documentation changes
  • My changes do not introduce new warnings
  • I have written tests demonstrating that my changes are effective or that my feature works
  • Local unit tests pass with my changes
  • Any changes dependent on mine have been merged and published in downstream modules.
  • A pull request for updating the documentation has been submitted.

…) and make transport type optional, infer based on other option fields
@danny-avila danny-avila merged commit e391347 into main Dec 17, 2024
4 checks passed
@danny-avila danny-avila deleted the feat/mcp branch December 17, 2024 18:13
owengo pushed a commit to openwengo/LibreChat that referenced this pull request Dec 20, 2024
* 📝 chore: Add comment to clarify purpose of check_updates.sh script

* feat: mcp package

* feat: add librechat-mcp package and update dependencies

* feat: refactor MCPConnectionSingleton to handle transport initialization and connection management

* feat: change private methods to public in MCPConnectionSingleton for improved accessibility

* feat: filesystem demo

* chore: everything demo and move everything under mcp workspace

* chore: move ts-node to mcp workspace

* feat: mcp examples

* feat: working sse MCP example

* refactor: rename MCPConnectionSingleton to MCPConnection for clarity

* refactor: replace MCPConnectionSingleton with MCPConnection for consistency

* refactor: manager/connections

* refactor: update MCPConnection to use type definitions from mcp types

* refactor: update MCPManager to use winston logger and enhance server initialization

* refactor: share logger between connections and manager

* refactor: add schema definitions and update MCPManager to accept logger parameter

* feat: map available MCP tools

* feat: load manifest tools

* feat: add MCP tools delimiter constant and update plugin key generation

* feat: call MCP tools

* feat: update librechat-data-provider version to 0.7.63 and enhance StdioOptionsSchema with additional properties

* refactor: simplify typing

* chore: update types/packages

* feat: MCP Tool Content parsing

* chore: update dependencies and improve package configurations

* feat: add 'mcp' directory to package and update configurations

* refactor: return CONTENT_AND_ARTIFACT format for MCP callTool

* chore: bump @librechat/agents

* WIP: MCP artifacts

* chore: bump @librechat/agents to v1.8.7

* fix: ensure filename has extension when saving base64 image

* fix: move base64 buffer conversion before filename extension check

* chore: update backend review workflow to install MCP package

* fix: use correct `mime` method

* fix: enhance file metadata with message and tool call IDs in image saving process

* fix: refactor ToolCall component to handle MCP tool calls and improve domain extraction

* fix: update ToolItem component for default isInstalled value and improve localization in ToolSelectDialog

* fix: update ToolItem component to use consistent text color for tool description

* style: add theming to ToolSelectDialog

* fix: improve domain extraction logic in ToolCall component

* refactor: conversation item theming, fix rename UI bug, optimize props, add missing types

* feat: enhance MCP options schema with base options (iconPath to start) and make transport type optional, infer based on other option fields

* fix: improve reconnection logic with parallel init and exponential backoff and enhance transport debug logging

* refactor: improve logging format

* refactor: improve logging of available tools by displaying tool names

* refactor: improve reconnection/connection logic

* feat: add MCP package build process to Dockerfile

* feat: add fallback icon for tools without an image in ToolItem component

* feat: Assistants Support for MCP Tools

* fix(build): configure rollup to use output.dir for dynamic imports

* chore: update @librechat/agents to version 1.8.8 and add @langchain/anthropic dependency

* fix: update CONFIG_VERSION to 1.2.0
@ThoughtPhotography
Copy link

ThoughtPhotography commented Dec 21, 2024

I've been using MCP with Claude Desktop a lot. It's nice to see it in LIbreChat. 👍
Websites that list MCP servers like Glama, and nearly every GitHub repo will have usage examples using .json, so supporting that would be ideal. It's simpler with less chance of messing up the main .yaml file.

claude_desktop_config.json typically contains nothing other than MCP servers, so if the same .json format was supported we could just copy/paste our current MCP config into the LIbreChat dir (renaming it if necessary), or importing .json in the settings (like chat history.)

I attached a bunch of MCP servers converted to .yaml (by Claude). The API keys are redacted, but it might be helpful to have a wider variety of examples.
mcp-example-librechat.txt

Btw, I updated to 0.7.6, but the librechat.yaml is still v1.1.5 (also in the repo.) I tried adding the mcp-servers to v1.1.5., but 18 of 20 failed according to Docker.

Claude .json example.
image

@epaproditus
Copy link

I attempted to set this up on an Ubuntu server at home. While I successfully configured Librechat, the MCP tools did not set up properly. I managed to establish the filesystem MCP server, but when I tried to add another server, like the Todoist MCP server, it failed. I used the deploy-compose.yml file for deployment, and here’s my librechat.yaml configuration. I experimented with various configurations, but all were unsuccessful. I even tried the one mentioned in the earlier testing comment above. I'm not an expert, so I might be overlooking something obvious and would appreciate guidance either way.

mcpServers:
  todoist:
    command: npx
    args:
      - -y
      - "@abhiz123/todoist-mcp-server"
    env:
      TODOIST_API_TOKEN: "REPLACE_WITH_YOUR_API_TOKEN"
  brave-search:
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-brave-search"
    env:
      BRAVE_API_KEY: "REPLACE_WITH_YOUR_API_KEY"
  filesystem:
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-filesystem"
      - "/Users/abe"
  memory:
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-memory"
  github:
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-github"
    env:
      GITHUB_PERSONAL_ACCESS_TOKEN: "REPLACE_WITH_YOUR_PERSONAL_ACCESS_TOKEN"
  mcp-installer:
    command: npx
    args:
      - "@anaisbetts/mcp-installer"
  markdown:
    command: npx
    args:
      - -y
      - "mcp-obsidian"
      - "/Users/abe/Library/Mobile Documents/iCloud~md~obsidian/Documents/Vault"
  puppeteer:
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-puppeteer"
  airtable:
    command: npx
    args:
      - -y
      - "airtable-mcp-server"
      - "REPLACE_WITH_YOUR_AIRTABLE_API_KEY"
  sequential-thinking:
    command: npx
    args:
      - -y
      - "@modelcontextprotocol/server-sequential-thinking"
  playwright:
    command: npx
    args:
      - -y
      - "@executeautomation/playwright-mcp-server"

@danny-avila
Copy link
Owner Author

@ThoughtPhotography appreciate the feedback. We will simply rely on the librechat.yaml file for now. I will see about using JSON from the frontend, though.

@danny-avila
Copy link
Owner Author

@epaproditus open a troubleshooting discussion and post relevant logs.

I’m locking discussion here since it’s easily missed and comments here are intended for the actual code.

Repository owner locked as off-topic and limited conversation to collaborators Dec 22, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants