mirror of
https://github.com/mcp-use/mcp-use.git
synced 2026-09-14 18:06:01 +08:00
8d4cb4719b
* initial commit * update to code mode * Squash all commits: Add CLI deploy functionality, server tool inspector, and various improvements (#467) * chore(release): exit prerelease mode and version packages (#473) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Docs/tunnel docs (#474) * chore: add tunnelling docs * chore: add tunnelling docs * docs: enhance tunneling documentation with link to @mcp-use/tunnel package * docs: update tunneling documentation with improved code examples and formatting * feat: Add verify parameter to MCPClient and connectors (#478) * feat: add verify parameter to MCPClient and connectors - Introduced a new optional `verify` parameter in `MCPClient`, `HttpConnector`, and configuration functions to control SSL certificate verification. - Updated relevant methods to utilize the `verify` parameter, ensuring consistent handling of SSL verification across the client and connectors. - Enhanced the SSE and Streamable HTTP connection managers to accept a custom HTTPX client factory for improved flexibility in connection handling. * fix: linting and docs * fix: http connector test * Update docs/python/api-reference/mcp_use_client_config.mdx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Pietro Zullo <62951181+pietrozullo@users.noreply.github.com> * fix: docs --------- Signed-off-by: Pietro Zullo <62951181+pietrozullo@users.noreply.github.com> Co-authored-by: Pietro Zullo <62951181+pietrozullo@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Canary release (#476) * Implement iframe log console for inspector (#475) * Docs/tunnel docs (#474) * chore: add tunnelling docs * chore: add tunnelling docs * docs: enhance tunneling documentation with link to @mcp-use/tunnel package * docs: update tunneling documentation with improved code examples and formatting * feat: Add iframe console logging and UI Implement a system to capture and display console logs from iframes. This includes injecting a script into iframes to intercept console messages and a UI component to display them in the parent window. Co-authored-by: tonxipad <tonxipad@gmail.com> * feat: Conditionally inject console interceptor for same-origin iframes Co-authored-by: tonxipad <tonxipad@gmail.com> * refactor: update IframeConsole component for improved UI and styling - Removed unused XIcon import. - Adjusted LogLevelBadge styling for better visual consistency. - Renamed "Iframe Console" to "Widget Console Logs" for clarity. - Modified button styling for better alignment and spacing. * feat: add HTMLIFrameElement and MessageEvent to ESLint config - Updated ESLint configuration to include HTMLIFrameElement and MessageEvent as readonly types, enhancing type safety for iframe-related code. * feat: implement auto-scroll functionality in IframeConsole component - Added useRef and useEffect hooks to enable auto-scrolling to the bottom of the console when logs change or the console opens. - Updated the console's container div to use the scrollContainerRef for managing scroll position. * chore: lint & format * chore: changeset --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: tonxipad <tonxipad@gmail.com> * chore: enter canary prerelease mode * chore(typescript): version packages (canary) * Feat/consistent sub for tunnel (#480) * Docs/tunnel docs (#474) * chore: add tunnelling docs * chore: add tunnelling docs * docs: enhance tunneling documentation with link to @mcp-use/tunnel package * docs: update tunneling documentation with improved code examples and formatting * Refactor CLI tunnel functionality to support optional subdomain and save to manifest - Updated `startTunnel` function to accept an optional subdomain parameter. - Enhanced subdomain extraction from the tunnel URL and updated the manifest file with the subdomain. - Cleaned up commented-out code related to tunnel handling in the CLI. - Improved logging for tunnel establishment and subdomain saving. * chore: changeset * format * chore(typescript): version packages (canary) * Refactor tunnel argument handling in CLI to streamline subdomain flag usage and improve logging * remove console log * [typescript][server] Fix tools with async calls (#481) * fix tools with async calls * FORMAT * chore(typescript): version packages (canary) * fix/minor fix post canary (#482) * fix server async call * wrap all handle request calls in wait function * changeset * chore(typescript): version packages (canary) * window.openai emulation and ChatGPT Integration debugging (#469) * feat: Add WidgetFullscreenWrapper component Co-authored-by: tonxipad <tonxipad@gmail.com> * Docs/tunnel docs (#474) * chore: add tunnelling docs * chore: add tunnelling docs * docs: enhance tunneling documentation with link to @mcp-use/tunnel package * docs: update tunneling documentation with improved code examples and formatting * feat: Enhance OpenAIComponentRenderer with tool call handling and display mode management - Implemented tool call handling with error management and response formatting for OpenAI API compatibility. - Added support for follow-up messages and localStorage fallback for pending follow-ups. - Introduced display mode management (inline, pip, fullscreen) with dynamic iframe resizing and a close button for fullscreen mode. - Updated TypeScript configuration to include .tsx files for better component support. * fix: maintain subdomain across builds * remove console * refactor: replace direct serverBaseUrl usage with getServerBaseUrl method for improved consistency * refactor: enhance WidgetFullscreenWrapper with hoverable icon buttons for fullscreen and pip modes * feat: implement dev widget proxy and asset handling for improved development experience * refactor: update OpenAIComponentRenderer to handle global updates for display mode and theme, enhancing iframe communication * feat: add WidgetDebugger export to enhance debugging capabilities in the React package * chore: fix type * format * chore: changeset * remove irrelevant content * chore: add changeset for MCP-747-fix-apps-sdk-fullscreen-close-button-9e35 * refactor: improve tunnel shutdown handling and output suppression for better user experience * format * remove console log --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: tonxipad <tonxipad@gmail.com> * chore(typescript): version packages (canary) * Fix/settings button servers dropdown (#485) * feat: Add server connection management in Layout and ServerDropdown components - Introduced ServerConnectionModal for editing connection settings in the Layout component. - Updated ServerDropdown to handle connection options and display selected server status. - Enhanced MCPConnection interface to include transportType and proxyConfig for better connection management. - Implemented connection update logic with success notifications. * add gear also to home * chore: changeset and format * chore(typescript): version packages (canary) * feat: Enhance ConnectionSettingsForm layout and add utility styles (#486) - Updated ConnectionSettingsForm component to improve layout responsiveness with new utility classes. - Added a new CSS utility for flex column and row layout. - Cleaned up imports for better organization. * chore(typescript): version packages (canary) * Update libraries/typescript/packages/cli/CHANGELOG.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com> * Update libraries/typescript/packages/cli/src/index.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com> * Update libraries/typescript/packages/cli/src/index.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com> * Update libraries/typescript/.changeset/clear-wombats-juggle.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com> * Feature/mcp 743 tool argument autoformats and moves the cursor (#487) * refactor(ToolsTab, ToolInputForm): enhance JSON handling for object/array types - Updated ToolsTab to initialize object and array types as empty JSON strings to preserve formatting. - Improved argument parsing in ToolsTab to handle JSON strings for object/array types before tool execution. - Modified ToolInputForm to display objects/arrays as formatted JSON strings, ensuring user input is preserved. * chore: changeset * chore(typescript): version packages (canary) * Fix/remove console button from chat (#488) * remove mcp url console log * feat(OpenAIComponentRenderer): add showConsole prop to control console visibility * Feature/mcp 837 load list of models for providers (#489) * remove mcp url console log * Enhance ConfigurationDialog with model fetching and caching - Added functionality to fetch models from OpenAI, Anthropic, and Google APIs based on the selected provider. - Implemented caching for fetched models using localStorage to improve performance and reduce API calls. - Updated the UI to display loading states and errors when fetching models. - Refactored API key handling to support provider-specific storage in localStorage. - Improved user experience by debouncing API calls and dynamically updating the model selection based on the provider. * fix: reorder imports in useConfig.ts for better clarity * chore(typescript): version packages (canary) --------- Signed-off-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: tonxipad <tonxipad@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Pietro Zullo <62951181+pietrozullo@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * chore(release): exit prerelease mode and version packages (#490) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Update Dockerfile Signed-off-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com> * fix: x icon light mode * docs: Improve typescript server docs (#491) * fix: update installation commands and enhance quickstart documentation - Changed `pnpm run dev` to `pnpm dev` in installation instructions across multiple files for consistency. - Improved the quickstart guide by clarifying the MCP server framework's capabilities and updating the project structure details. - Added a base URL configuration for the MCP server in the configuration documentation to ensure proper functionality of UI widgets. * minor * add fallback --------- Signed-off-by: Luigi Pederzani <luigipederzani@gmail.com> * Docs/inspector (#492) * refactor: reorganize documentation structure for Inspector and Dev Tools - Updated the docs.json file to consolidate Inspector and Tunneling pages under a new "Dev Tools" group. - Removed redundant entries for Inspector and Tunneling from the documentation structure. - Added a sidebar title for the Inspector page to enhance navigation. * docs: enhance Inspector documentation and add new CLI usage guides - Updated `docs.json` to include new pages for CLI usage, connection settings, keyboard shortcuts, command palette, integration, debugging ChatGPT apps, and development under the Inspector section. - Expanded the Inspector documentation to cover new features, including CLI usage and detailed guides for keyboard shortcuts and integration. - Improved the `self-hosting` documentation to reference the new CLI usage guide. - Enhanced the `apps-sdk-resources` documentation with additional details on widget state and testing procedures using the Inspector. * fix broken links * chore: remove unuseful docs * Feat/python/pretty display (#497) * pretty display implementation * docs update * initial commit * docs * fix tests * example streams and uses anthropic * docs * docs image * fix type checking mock * add rich to requirements * enable pretty pritns in all examples --------- Signed-off-by: Pietro Zullo <62951181+pietrozullo@users.noreply.github.com> Signed-off-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com> Signed-off-by: Luigi Pederzani <luigipederzani@gmail.com> Co-authored-by: Enrico Toniato <2827496+tonxxd@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Vincenzo Reina <vincenzoreinaa05@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: tonxipad <tonxipad@gmail.com> Co-authored-by: Luigi Pederzani <luigipederzani@gmail.com>
114 lines
3.4 KiB
Python
114 lines
3.4 KiB
Python
import asyncio
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from langchain_core.tools import BaseTool
|
|
from langchain_openai import ChatOpenAI
|
|
from pydantic import BaseModel
|
|
|
|
from mcp_use.agents.mcpagent import MCPAgent
|
|
|
|
# Add the project root to the Python path
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
|
from mcp_use.managers.base import BaseServerManager
|
|
|
|
|
|
class DynamicTool(BaseTool):
|
|
"""A tool that is created dynamically."""
|
|
|
|
name: str
|
|
description: str
|
|
args_schema: type[BaseModel] | None = None
|
|
|
|
def _run(self) -> str:
|
|
return f"Hello from {self.name}!"
|
|
|
|
async def _arun(self) -> str:
|
|
return f"Hello from {self.name}!"
|
|
|
|
|
|
class HelloWorldTool(BaseTool):
|
|
"""A simple tool that returns a greeting and adds a new tool."""
|
|
|
|
name: str = "hello_world"
|
|
description: str = "Returns the string 'Hello, World!' and adds a new dynamic tool."
|
|
args_schema: type[BaseModel] | None = None
|
|
server_manager: "SimpleServerManager"
|
|
|
|
def _run(self) -> str:
|
|
new_tool = DynamicTool(
|
|
name=f"dynamic_tool_{len(self.server_manager.tools)}", description="A dynamically created tool."
|
|
)
|
|
self.server_manager.add_tool(new_tool)
|
|
return "Hello, World! I've added a new tool. You can use it now."
|
|
|
|
async def _arun(self) -> str:
|
|
new_tool = DynamicTool(
|
|
name=f"dynamic_tool_{len(self.server_manager.tools)}", description="A dynamically created tool."
|
|
)
|
|
self.server_manager.add_tool(new_tool)
|
|
return "Hello, World! I've added a new tool. You can use it now."
|
|
|
|
|
|
class SimpleServerManager(BaseServerManager):
|
|
"""A simple server manager that provides a HelloWorldTool."""
|
|
|
|
def __init__(self):
|
|
self._tools: list[BaseTool] = []
|
|
self._initialized = False
|
|
# Pass a reference to the server manager to the tool
|
|
self._tools.append(HelloWorldTool(server_manager=self))
|
|
|
|
def add_tool(self, tool: BaseTool):
|
|
self._tools.append(tool)
|
|
|
|
async def initialize(self) -> None:
|
|
self._initialized = True
|
|
|
|
@property
|
|
def tools(self) -> list[BaseTool]:
|
|
return self._tools
|
|
|
|
def has_tool_changes(self, current_tool_names: set[str]) -> bool:
|
|
new_tool_names = {tool.name for tool in self.tools}
|
|
return new_tool_names != current_tool_names
|
|
|
|
|
|
async def main():
|
|
# Initialize the LLM
|
|
llm = ChatOpenAI(model="gpt-5")
|
|
|
|
# Instantiate the custom server manager
|
|
simple_server_manager = SimpleServerManager()
|
|
|
|
# Create an MCPAgent with the custom server manager
|
|
agent = MCPAgent(
|
|
llm=llm,
|
|
use_server_manager=True,
|
|
server_manager=simple_server_manager,
|
|
pretty_print=True,
|
|
)
|
|
|
|
# Manually initialize the agent
|
|
await agent.initialize()
|
|
|
|
# Run the agent with a query that uses the custom tool
|
|
print("--- First run: calling hello_world ---")
|
|
result = await agent.run("Use the hello_world tool", manage_connector=False)
|
|
print(result)
|
|
|
|
# Clear the conversation history to avoid confusion
|
|
agent.clear_conversation_history()
|
|
|
|
# Run the agent again to show that the new tool is available
|
|
print("\n--- Second run: calling the new dynamic tool ---")
|
|
result = await agent.run("Use the dynamic_tool_1", manage_connector=False)
|
|
print(result)
|
|
|
|
# Manually close the agent
|
|
await agent.close()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|