diff --git a/.cursor-plugin/plugin.json b/.cursor-plugin/plugin.json new file mode 100644 index 0000000..3f8a95f --- /dev/null +++ b/.cursor-plugin/plugin.json @@ -0,0 +1,29 @@ +{ + "name": "parseable", + "displayName": "Parseable", + "version": "0.2.14", + "description": "Query and manage Parseable logs, metrics, datasets, and alerts from Cursor.", + "author": { + "name": "Parseable" + }, + "publisher": "Parseable", + "homepage": "https://www.parseable.com", + "repository": "https://github.com/parseablehq/parseable-mcp-server", + "license": "Apache-2.0", + "logo": "assets/logo.svg", + "keywords": [ + "parseable", + "observability", + "logs", + "metrics", + "alerts", + "mcp" + ], + "category": "developer-tools", + "tags": [ + "observability", + "monitoring", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/README.md b/README.md index 7494002..8764ea7 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,35 @@ npx -y @parseable/parseable-mcp-server init \ Supported `--client` values: `claude-desktop`, `cursor`. +### Cursor Marketplace plugin + +The repository also contains a native Cursor plugin manifest. Marketplace installs connect to `https://mcp.parseable.com/mcp` and read credentials from the environment. + +Set these variables before starting Cursor: + +```bash +export PARSEABLE_URL="https://your-parseable.example.com" +export PARSEABLE_API_KEY="your-api-key" +export PARSEABLE_MODE="self-hosted" +``` + +`PARSEABLE_API_KEY` and `PARSEABLE_MODE` are required by the Cursor plugin. Use `PARSEABLE_MODE=cloud` and omit `PARSEABLE_URL` for Parseable Cloud. Use `PARSEABLE_MODE=self-hosted` with `PARSEABLE_URL` for self-hosted Parseable. + +```bash +# Parseable Cloud +export PARSEABLE_MODE="cloud" +export PARSEABLE_API_KEY="your-cloud-api-key" +unset PARSEABLE_URL +``` + +Then install the Parseable plugin from the Cursor Marketplace. If Cursor was opened from the macOS dock or another GUI launcher that does not inherit shell variables, use the interactive setup instead: + +```bash +npx -y @parseable/parseable-mcp-server init --client cursor +``` + +Plugin metadata lives in `.cursor-plugin/plugin.json`; its MCP connection configuration lives in `mcp.json`. Keep the plugin version aligned with the npm package version when releasing. + --- ## Quickstart — HTTP (hosted) diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000..981da88 --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/mcp.json b/mcp.json new file mode 100644 index 0000000..aa0809c --- /dev/null +++ b/mcp.json @@ -0,0 +1,13 @@ +{ + "mcpServers": { + "parseable": { + "type": "http", + "url": "https://mcp.parseable.com/mcp", + "headers": { + "X-API-Key": "${env:PARSEABLE_API_KEY}", + "X-Parseable-Mode": "${env:PARSEABLE_MODE}", + "X-Parseable-URL": "${env:PARSEABLE_URL}" + } + } + } +} diff --git a/test/auth.test.ts b/test/auth.test.ts index 21a6be8..deb6820 100644 --- a/test/auth.test.ts +++ b/test/auth.test.ts @@ -107,6 +107,12 @@ describe("parseRequestAuth", () => { ); }); + it("requires URL when self-hosted mode is explicit", () => { + expect(() => + parseRequestAuth({ "x-parseable-mode": "self-hosted", "x-api-key": "secret" }), + ).toThrow(/X-Parseable-URL/); + }); + it("rejects unknown mode", () => { expect(() => parseRequestAuth({ ...goodHeaders, "x-parseable-mode": "enterprise" })).toThrow( /cloud or self-hosted/,