From 00ef6e0d2453f4ca353ff43375a87ac607bbc7c5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 07:46:12 +0000 Subject: [PATCH 1/4] Editorial: Structure - Added intro line after main heading; Headings - Changed to sentence case for "Create your server", "Set up the secrets in your environment", "Run your MCP server", "Configure your MCP clients", and "Next steps" --- .../mcp-server-quickstart/page.mdx | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/app/en/get-started/quickstarts/mcp-server-quickstart/page.mdx b/app/en/get-started/quickstarts/mcp-server-quickstart/page.mdx index 8f28c5921..f09ba056d 100644 --- a/app/en/get-started/quickstarts/mcp-server-quickstart/page.mdx +++ b/app/en/get-started/quickstarts/mcp-server-quickstart/page.mdx @@ -7,12 +7,14 @@ import { Steps, Tabs, Callout } from "nextra/components"; import { SignupLink } from "@/app/_components/analytics"; import { GuideOverview } from "@/app/_components/guide-overview"; -# Build MCP Server QuickStart +# Build MCP server quickstart + +Build and run an MCP server with tools that you create. -Build and run an MCP Server with tools that you create. +Build and run an MCP server with tools that you create. @@ -67,9 +69,9 @@ pip install arcade-mcp -## Create Your Server +## Create your server -In your terminal, run the following command to scaffold a new MCP Server called `my_server`: +In your terminal, run the following command to scaffold a new MCP server called `my_server`: ```bash arcade new my_server @@ -100,7 +102,7 @@ my_server/ > If you're having issues with the `arcade` command, please see the [Troubleshooting](#troubleshooting) section. -## Setup the secrets in your environment +## Set up the secrets in your environment Secrets are sensitive strings like passwords, API keys, or other tokens that grant access to a protected resource or API. Arcade includes the "whisper_secret" tool that requires you to set a secret key in your environment. If you don't set the secret, the tool will return an error. @@ -140,9 +142,9 @@ arcade login Follow the instructions in your browser to connect your terminal to your Arcade account. -## Run your MCP Server +## Run your MCP server -Run your MCP Server using one of the following commands in your terminal: +Run your MCP server using one of the following commands in your terminal: Date: Thu, 26 Feb 2026 07:46:41 +0000 Subject: [PATCH 2/4] Editorial: Structure - Added intro line; Headings - Changed to sentence case --- .../tool-basics/build-mcp-server/page.mdx | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/app/en/guides/create-tools/tool-basics/build-mcp-server/page.mdx b/app/en/guides/create-tools/tool-basics/build-mcp-server/page.mdx index 981ab61a2..957d7e118 100644 --- a/app/en/guides/create-tools/tool-basics/build-mcp-server/page.mdx +++ b/app/en/guides/create-tools/tool-basics/build-mcp-server/page.mdx @@ -7,6 +7,8 @@ import { Steps, Tabs, Callout } from "nextra/components"; # Creating an MCP Server with Arcade +Learn how to create, test, deploy, and publish a custom MCP server with Arcade. + The `arcade_mcp_server` package is the secure framework to build and run MCP servers with your Arcade tools. It is easiest to use with the `arcade-mcp` package (Arcade's CLI) which can scaffold your MCP server with all the necessary files and dependencies, configure MCP Clients to connect to your server, deploy your server to the cloud, and more. This guide walks you through the complete process of creating a custom MCP server with Arcade. @@ -26,7 +28,7 @@ Build and run a secure MCP server with tools that you define. - How to run MCP servers with Arcade tools using the [`arcade_mcp_server`](/references/mcp/python) package - How to use `arcade new` from the `arcade-mcp` CLI to create your server project with all necessary files and dependencies. -- How to run your local MCP Server with the Arcade CLI and register it with the Arcade Engine so that your agent can find and use your tool. +- How to run your local MCP server with the Arcade CLI and register it with the Arcade Engine so that your agent can find and use your tool. @@ -63,9 +65,9 @@ pip install arcade-mcp -## Create Your Server +## Create your server -In your terminal, run the following command to scaffold a new MCP Server called `my_server`: +In your terminal, run the following command to scaffold a new MCP server called `my_server`: ```bash arcade new my_server @@ -84,9 +86,9 @@ my_server/ └── pyproject.toml ``` -1. **server.py** Main server file with MCPApp and example tools. It creates an `MCPApp`, defines tools with `@app.tool`, and will start the server with `app.run()` when the file is executed directly. +1. **server.py** Main server file with MCPApp and example tools. It creates an `MCPApp`, defines tools with `@app.tool`, and starts the server with `app.run()` when you execute the file directly. 1. **pyproject.toml** Dependencies and project configuration -1. **.env.example** Example `.env` file at the project root containing a secret required by one of the generated tools in `server.py`. Arcade automatically discovers `.env` files by traversing upward from the current directory, so placing it at the project root makes it accessible from any subdirectory. Environments are loaded on server start, so **if you update the `.env` file, you will need to restart your server.** +1. **.env.example** Example `.env` file at the project root containing a secret required by one of the generated tools in `server.py`. Arcade automatically discovers `.env` files by traversing upward from the current directory, so placing it at the project root makes it accessible from any subdirectory. The server loads environments on start, so **if you update the `.env` file, you will need to restart your server.** ```python filename="server.py" showLineNumbers #!/usr/bin/env python3 @@ -112,7 +114,7 @@ def greet(name: Annotated[str, "The name of the person to greet"]) -> str: @app.tool(requires_secrets=["MY_SECRET_KEY"]) def whisper_secret(context: Context) -> Annotated[str, "The last 4 characters of the secret"]: """Reveal the last 4 characters of a secret""" - # Secrets are injected into the context at runtime. + # Arcade injects secrets into the context at runtime. # LLMs and MCP clients cannot see or access your secrets # You can define secrets in a .env file. try: @@ -133,12 +135,12 @@ async def get_posts_in_subreddit( subreddit = subreddit.lower().replace("r/", "").replace(" ", "") # Prepare the httpx request - # OAuth token is injected into the context at runtime. + # Arcade injects OAuth token into the context at runtime. # LLMs and MCP clients cannot see or access your OAuth tokens. oauth_token = context.get_auth_token_or_empty() headers = { "Authorization": f"Bearer {oauth_token}", - "User-Agent": "finally-mcp-server", + "User-Agent": "finally mcp server", } params = {"limit": 5} url = f"https://oauth.reddit.com/r/{subreddit}/hot" @@ -157,7 +159,7 @@ if __name__ == "__main__": # - "stdio" (default): Standard I/O for Claude Desktop, CLI tools, etc. # Supports tools that require_auth or require_secrets out-of-the-box # - "http": HTTPS streaming for Cursor, VS Code, etc. - # Does not support tools that require_auth or require_secrets unless the server is deployed + # The system does not support tools that require_auth or require_secrets unless you deploy the server # using 'arcade deploy' or added in the Arcade Developer Dashboard with 'Arcade' server type transport = sys.argv[1] if len(sys.argv) > 1 else "stdio" @@ -165,9 +167,9 @@ if __name__ == "__main__": app.run(transport=transport, host="127.0.0.1", port=8000) ``` -## Setup the secrets in your environment +## Set up secrets in your environment -Secrets are sensitive strings like passwords, API keys, or other tokens that grant access to a protected resource or API. Arcade includes the "whisper_secret" tool that requires a secret key to be set in your environment. If the secret is not set, the tool will return an error. +Secrets are sensitive strings like passwords, API keys, or other tokens that grant access to a protected resource or API. Arcade includes the "whisper_secret" tool that requires a secret key in your environment. If you do not set the secret, the tool will return an error. @@ -177,7 +179,7 @@ You can create a `.env` file at your project root directory and add your secret: MY_SECRET_KEY="my-secret-value" ``` -Arcade automatically discovers `.env` files by traversing upward from the current directory through parent directories. This means you can place your `.env` file at the project root (`my_server/`), and it will be found even when running your server from a subdirectory like `src/my_server/`. +Arcade automatically discovers `.env` files by traversing upward from the current directory through parent directories. This means you can place your `.env` file at the project root (`my_server/`), and the system will find it even when running your server from a subdirectory like `src/my_server/`. The generated project includes a `.env.example` file at the project root with the secret key name and example value. You can rename it to `.env` to start using it. @@ -205,11 +207,11 @@ Since the Reddit tool accesses information only available to your Reddit account arcade login ``` -Follow the instructions in your browser, and once you've finished, your terminal will be connected to your Arcade account. +Follow the instructions in your browser, and once you've finished, your terminal will connect to your Arcade account. -## Run your MCP Server +## Run your MCP server -Run your MCP Server using one of the following commands in your terminal: +Run your MCP server using one of the following commands in your terminal: -That's it! Your MCP server is running and connected to your AI assistant. +That's it Your MCP server is running and connected to your AI assistant. @@ -319,10 +321,10 @@ That's it! Your MCP server is running and connected to your AI assistant. - **Tool Docstrings** Use docstrings to provide a description of a tool to the language model - **Command Line Arguments** Pass transport type as command line argument -### Next steps +## Next steps - **Create custom tools that use auth**: [Learn how to create tools with authorization](/guides/create-tools/tool-basics/create-tool-auth) - **Create custom tools that use secrets**: [Learn how to create tools with secrets](/guides/create-tools/tool-basics/create-tool-secrets) - **Learn the capabilities of the `Context` object**: [Understanding the Context object](/guides/create-tools/tool-basics/runtime-data-access) - **Evaluate your tools**: [Explore how to evaluate tool performance](/guides/create-tools/evaluate-tools/why-evaluate) -- **Deploy your MCP server**: [Learn how to deploy your MCP server](/guides/deployment-hosting/arcade-deploy) +- **Deploy your MCP server**: [Learn how to deploy your MCP server](/guides/deployment-hosting/arcade-deploy) \ No newline at end of file From df0d193fd88028b297a3045fd0bae08119b6d706 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 07:47:48 +0000 Subject: [PATCH 3/4] Editorial: Voice and Tone - Removed hedging language like "very inconvenient"; Terminology - Changed "MCP Server" to "MCP server"; Removed "simply" to avoid dumbing down language --- .../tool-basics/create-tool-secrets/page.mdx | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/app/en/guides/create-tools/tool-basics/create-tool-secrets/page.mdx b/app/en/guides/create-tools/tool-basics/create-tool-secrets/page.mdx index a18fa88aa..8fdb44d13 100644 --- a/app/en/guides/create-tools/tool-basics/create-tool-secrets/page.mdx +++ b/app/en/guides/create-tools/tool-basics/create-tool-secrets/page.mdx @@ -35,9 +35,9 @@ Secrets are sensitive strings like passwords, API keys, or other tokens that gra ## Why use secrets in your tools? -Secrets enable you to securely deploy a function that requires sensitive information at runtime. And while these can be consumed directly from the runtime environment inside your tool function, this becomes very inconvenient, expensive, hard to maintain, and insecure when deploying at scale. +Secrets enable you to securely deploy a function that requires sensitive information at runtime. This becomes convenient, secure, and maintainable when deploying at scale. -For example, if your tool requires an API key to use an external service, but only _after_ doing some computationally expensive work, you need to ensure that the API key is present _before_ the computationally expensive work is done. The function below would fail if the API key is not present. +For example, if your tool requires an API key to use an external service, but only _after_ doing some computationally expensive work, you need to ensure that the API key is present _before_ the computationally expensive work completes. The function below would fail if the API key is not present. ```python import os @@ -56,9 +56,9 @@ def my_tool(task: str) -> str: return "Failed to upload result" ``` -We can work around this by carefully checking for the API key before doing the computationally expensive work, of course, but this is error prone and difficult to maintain, and you may only become aware of the issue after deploying multiple instances of your server. +You can work around this by checking for the API key before doing the computationally expensive work, but this is error prone and difficult to maintain, and you may only become aware of the issue after deploying multiple instances of your server. -Arcade provides a way to securely store and access secrets inside your tools in a way that is easy to manage across multiple instances of your servers, and that will prevent the tool from running if the secret is not provided. In this guide, you'll learn how to use secrets in your custom Arcade tools. +Arcade provides a way to securely store and access secrets inside your tools in a way that is manageable across multiple instances of your servers, and that will prevent the tool from running if the secret is not provided. In this guide, you'll learn how to use secrets in your custom Arcade tools. @@ -95,10 +95,10 @@ You can store your secret in the Arcade Dashboard by: - Entering the secret ID and value - Clicking the "Create" button -This will make the secret available to your MCP server, when deployed to Arcade. +This will make the secret available to your MCP server when you deploy it to Arcade. - The Arcade Dashboard will make the secret available to your MCP server when it is deployed. Secrets set in the Arcade Dashboard are not available to your MCP server when it is running locally. + The Arcade Dashboard will make the secret available to your MCP server when you deploy it. Secrets set in the Arcade Dashboard are not available to your MCP server when it runs locally. @@ -110,7 +110,7 @@ arcade secret set MY_SECRET_KEY="my-secret-value" ``` - The Arcade CLI will make the secret available to your MCP server when it is deployed, because it upserts the secret into the Arcade Cloud. Secrets set in the Arcade CLI are not available to your MCP server when it is running locally. + The Arcade CLI will make the secret available to your MCP server when you deploy it, because it upserts the secret into Arcade Cloud. Secrets set in the Arcade CLI are not available to your MCP server when it runs locally. @@ -140,7 +140,7 @@ To ensure your stdio MCP server has access to the secrets, you can either ```json { "mcpServers": { - "simple": { + "basic": { "command": "uv", "args": [ "run", @@ -164,19 +164,19 @@ Note that the specific key name may vary depending on the MCP client you are usi This is only an illustrative example of how Arcade will ensure that the secret - is present before the tool is executed. In a real world application, you would + is present before the tool runs. In a real world application, you would use this secret to store sensitive information like API keys, database - credentials, etc, and not to simply print a confirmation string. + credentials, etc, and not to return a confirmation string. -In your [MCP Server](/guides/create-tools/tool-basics/build-mcp-server), create a new tool that uses the secret: +In your [MCP server](/guides/create-tools/tool-basics/build-mcp-server), create a new tool that uses the secret: - Use the `requires_secrets` parameter to declare which secrets your tool needs (`"SECRET_KEY"` in this example). - The tool's Context object has a `get_secret` method that you can use to access the secret value. ```python filename="secrets.py" showLineNumbers highlightLines={2,4,7} @app.tool( - requires_secrets=["SECRET_KEY"], # declare we need SECRET_KEY + requires_secrets=["SECRET_KEY"], # declare that the tool needs SECRET_KEY ) def use_secret(context: Context) -> str: """Read SECRET_KEY from context and return a masked confirmation string.""" @@ -188,7 +188,15 @@ def use_secret(context: Context) -> str: return f"Error getting secret: {e}" ``` -When your tool is executed, it will return: `"Got SECRET_KEY of length..."`. In a real world application, you would use this secret to connect to a remote database, API, etc. +When your tool runs, it will return: `"Got SECRET_KEY of length..."`. In a real world application, you would use this secret to connect to a remote database, API, etc. + +When the tool runs, your application executes the secret retrieval logic. In a real world application, you would use this secret to connect to a remote database, API, etc. + +The tool's Context object allows you to access secrets that your tool configurations define. The secret storage system makes the values available to your tool during execution. + + + Note: If you want to pass the `.env` environment variables to your MCP client so it can pass them to your MCP server as environment variables, you should set them appropriately in your MCP client configuration. For example, if you want to pass `.env` environment variables through the Cursor IDE to your MCP server, you can add the following to your `mcp.json` file. This approach ensures your secrets are available in this context regardless of whether you set them with the command line environment variables. + @@ -240,7 +248,7 @@ app = MCPApp( @app.tool( - requires_secrets=["SECRET_KEY"], # declare we need SECRET_KEY + requires_secrets=["SECRET_KEY"], # declare that the tool needs SECRET_KEY ) def use_secret(context: Context) -> str: """Read SECRET_KEY from context and return a masked confirmation string.""" @@ -292,4 +300,4 @@ For HTTP transport, view your server's API docs at [http://127.0.0.1:8000/docs]( - + \ No newline at end of file From ec50b6b043a26cebff2cab3bc3b19210411a2d47 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 07:48:20 +0000 Subject: [PATCH 4/4] Editorial: Structure - Added intro line; Arcade Terminology - Corrected capitalization of "MCP Server" to "MCP server" in body text and headings --- .../deployment-hosting/arcade-deploy/page.mdx | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/app/en/guides/deployment-hosting/arcade-deploy/page.mdx b/app/en/guides/deployment-hosting/arcade-deploy/page.mdx index 137a437c6..9e136faf3 100644 --- a/app/en/guides/deployment-hosting/arcade-deploy/page.mdx +++ b/app/en/guides/deployment-hosting/arcade-deploy/page.mdx @@ -8,12 +8,14 @@ import { SignupLink } from "@/app/_components/analytics"; # Deploying to the cloud with Arcade Deploy -Running your MCP servers locally is very convenient during development and testing. Once your MCP server is mature, however, you may want to access it from any MCP client, or to facilitate multi-user support. Doing all that from your computer comes with the complexity of running and maintaining a server, handling auth and high availability for all your users and all the integrations you want to support. Arcade Deploy takes care of all that for you. Your MCP server will be registered to Arcade, adding all the tools you created to the larger tool catalog. From there, you can create MCP Gateways to pick and choose which tools you want to use in your MCP clients, which can be from any connected MCP server. +Deploy your MCP server to the cloud with Arcade Deploy for multi-user access and simplified management. + +Running your MCP servers locally is convenient during development and testing. Once your MCP server is mature, however, you may want to access it from any MCP client, or to facilitate multi-user support. Doing all that from your computer comes with the complexity of running and maintaining a server, handling auth and high availability for all your users and all the integrations you want to support. Arcade Deploy takes care of all that for you. Your MCP server will register to Arcade, adding all the tools you created to the larger tool catalog. From there, you can create MCP Gateways to pick and choose which tools you want to use in your MCP clients, which can be from any connected MCP server. -This guide shows you how to deploy your MCP Server with Arcade Deploy. +This guide shows you how to deploy your MCP server with Arcade Deploy. @@ -21,15 +23,15 @@ This guide shows you how to deploy your MCP Server with Arcade Deploy. - - [uv package manager](https://docs.astral.sh/uv/getting-started/installation/) -- [Create an MCP Server](/guides/create-tools/tool-basics/build-mcp-server) +- [Create an MCP server](/guides/create-tools/tool-basics/build-mcp-server) -- How to deploy your existing MCP Server to the cloud with the `arcade deploy` CLI command. +- How to deploy your existing MCP server to the cloud with the `arcade deploy` CLI command. - How to create an MCP Gateway to pick and choose which tools you want to use in your MCP clients. -- How to use Arcade clients to call the tools in your MCP Server. +- How to use Arcade clients to call the tools in your MCP server. @@ -62,7 +64,7 @@ This guide shows you how to deploy your MCP Server with Arcade Deploy. If you have not created an MCP server yet, then follow the steps outlined in [this guide](/guides/create-tools/tool-basics/build-mcp-server) before deploying. -## Deploy your MCP Server +## Deploy your MCP server Run the deploy command in the directory where you started your MCP server (containing your `pyproject.toml` file) and specify the relative path to your entrypoint file via the `--entrypoint/-e` option. @@ -92,15 +94,14 @@ if __name__ == "__main__": It is important that your entrypoint file executes `MCPApp.run()` (or `app.run()` if `app` is of type `MCPApp`) when invoked directly. -We recommend to do it inside an `if __name__ == "__main__":` statement. - +The system recommends doing it inside an `if __name__ == "__main__":` statement. You should see output like the following: ```bash -Validating user is logged in... -✓ {arcade_user_id} is logged in +Validating user logs in... +✓ {arcade_user_id} logs in Validating pyproject.toml exists in current directory... ✓ pyproject.toml found at /path/to/your/project/pyproject.toml @@ -114,10 +115,10 @@ Validating server is healthy and extracting metadata before deploying... ✓ Found server name: my_server ✓ Found server version: 1.0.0 ✓ Found 3 tools -✓ Found 1 required secret(s) +✓ Found 1 required secret -Uploading 1 required secret(s) to Arcade... -✓ Uploading 'MY_SECRET_KEY' with value ending in ...ime! +Uploading 1 required secret to Arcade... +✓ Uploading 'MY_SECRET_KEY' with value ending in ...ime ✓ Secret 'MY_SECRET_KEY' uploaded Creating deployment package... @@ -129,14 +130,14 @@ Creating deployment package... Recent logs: data: {"Timestamp":"2025-10-27T16:03:45.429460682Z","Line":"Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details."} data: {"Timestamp":"2025-10-27T16:03:45.429466232Z","Line":"[GIN-debug] Listening and serving HTTP on :8002"} - data: {"Timestamp":"2025-10-27T16:03:47.577492621Z","Line":"[GIN] 2025/10/27 - 16:03:47 | 200 | 2.888808ms | 10.30.253.232 | GET \"/worker/health\""} + data: {"Timestamp":"2025-10-27T16:03:47.577492621Z","Line":"[GIN] 2025/10/27 - 16:03:47 | 200 | 2.888808 ms | 10.30.253.232 | GET \"/worker/health\""} data: {"Timestamp":"2025-10-27T16:03:48.230570179Z","Line":"INFO: 127.0.0.1:53384 - \"GET /worker/health HTTP/1.1\" 200 OK"} - data: {"Timestamp":"2025-10-27T16:03:48.231072632Z","Line":"[GIN] 2025/10/27 - 16:03:48 | 200 | 4.526797ms | 10.30.253.232 | GET \"/worker/health\""} + data: {"Timestamp":"2025-10-27T16:03:48.231072632Z","Line":"[GIN] 2025/10/27 - 16:03:48 | 200 | 4.526797 ms | 10.30.253.232 | GET \"/worker/health\""} You can safely exit with Ctrl+C at any time. The deployment will continue normally. -✓ Deployment successful! Server is running. +✓ Deployment successful Server is running. ``` ## Manage your MCP servers in Arcade @@ -146,20 +147,20 @@ Navigate to the [Servers](https://api.arcade.dev/dashboard/servers) page in your - Monitor the health status of the server - Delete the server - Test and execute all the tools -- Manage users connected to the Auth providers +- Manage users connected to the auth providers - Manage the secrets for the server - Create [MCP Gateways](/guides/mcp-gateways) -## Create an MCP Gateway to call the tools in your MCP Server +## Create an MCP Gateway to call the tools in your MCP server -Once the MCP server is deployed to Arcade, all the tools in the server will be available in the [tool catalog](https://api.arcade.dev/dashboard/tools) page in your Arcade dashboard. To call the tools from an MCP client, you first need to [create an MCP Gateway](/guides/mcp-gateways) to pick and choose which tools you want to use in your MCP clients. +Once the MCP server deploys to Arcade, all the tools in the server will be available in the [tool catalog](https://api.arcade.dev/dashboard/tools) page in your Arcade dashboard. To call the tools from an MCP client, you first need to [create an MCP Gateway](/guides/mcp-gateways) to pick and choose which tools you want to use in your MCP clients. -When creating an MCP gateway, you can select the tools you want to include in the Gateway from any MCP Servers available to the project, including the one you just deployed. +When creating an MCP gateway, you can select the tools you want to include in the Gateway from any MCP servers available to the project, including the one you just deployed. -## Use Arcade clients to call the tools in your MCP Server +## Use Arcade clients to call the tools in your MCP server -You can use any of the available [Arcade clients](/references) to call the tools in your MCP Server. When using the clients, you are not required to create an MCP Gateway, as the client will handle the connection to all tools in your Arcade project directly. +You can use any of the available [Arcade clients](/references) to call the tools in your MCP server. When using the clients, you can access all tools in your Arcade project directly without requiring creation of an MCP Gateway. -Your MCP Server is now deployed and managed by Arcade, and ready to be used in your MCP clients! +Your MCP server is now deployed and managed by Arcade, and ready for use in your MCP clients \ No newline at end of file