AI Playground by OwnYourWebsite
See the codeA developer-first, local-first LLM playground that integrates the Model Context Protocol (MCP) directly into your browser. Configure models, connect remote/hosted MCP servers, trace request/response payloads in raw JSON, and export production-ready snippets in seconds.
https://api.githubcopilot.com/mcp/) natively using your GitHub PAT.npm install
cp .env.example .env.local # optional: configure environment variables (see below)
npm run dev
Open http://localhost:3000 to view the workspace.
sk-...)sk-ant-...)gsk_...)http://127.0.0.1:11434/api)get_me, get_file_contents, etc.) will load instantly!Connect any remote MCP server — not just the built-in GitHub preset — by adding it directly in the right sidebar.
Tavily Search).https://mcp.tavily.com/mcp).Authorization: Bearer <your-key>. Use "+ Add header" to add more than
one (e.g. an API key header plus a version header).Example: Tavily's remote MCP (
https://mcp.tavily.com/mcp) works with a singleAuthorization: Bearer <your Tavily key>header. This is just one example among many — the app is intentionally vendor-neutral, so you can plug in any Streamable HTTP / SSE MCP server.
Security note: MCP tool output is untrusted content. The model should treat tool results as data, never as instructions. Review tool arguments before approving, and only connect servers you trust.
When a model "thinks" before answering, that hidden reasoning is surfaced in the Thought process accordion above each assistant reply. It is collapsed by default and shows a live "Thinking…" placeholder while it is still streaming.
The accordion is fed from two sources:
<think>, <thinking>, <reasoning>, and
<thought> are parsed client-side, stripped from the visible answer, and
shown under the accordion instead — with a fallback if a tag opens but never
closes.Reasoning content never bleeds into the main reply — the visible answer always stays clean.
Skills are reusable instruction presets / prompt templates shown in the left sidebar with an icon. Four built-in skills are seeded on first run:
| Skill | Icon |
|---|---|
| Repo Explorer | folder-tree |
| Code Reviewer | code |
| Debugger | bug |
| Data Analyst | database |
Clicking a skill opens an editable instruction preview and a "use GitHub MCP"
toggle. Apply places the instructions into the input box for your next
message. You can create custom skills (choose a name, an icon including
sparkles, instructions, and an optional GitHub MCP toggle) and delete custom
ones. Everything is stored locally in IndexedDB via getSkills / saveSkill /
deleteSkill.
All environment variables are optional — the app works out of the box with an empty .env.local. See .env.example for placeholders.
| Variable | Default | Description |
|---|---|---|
ALLOW_PRIVATE_MCP | (empty) | Set to 1 only for local development to allow http:// URLs and private/localhost MCP servers through the SSRF-shielded proxy (and to allow a local Ollama URL on hosted deployments). Never enable this on a publicly deployed instance (e.g. Vercel). |
UPSTASH_REDIS_REST_URL | (empty) | Upstash Redis REST endpoint. If both Upstash variables are empty, rate limiting is fully disabled. Create a free database at upstash.com → Redis → REST API details. |
UPSTASH_REDIS_REST_TOKEN | (empty) | Upstash Redis REST token (kept server-side only). |
RATE_LIMIT_CHAT_PER_MINUTE | 20 | Chat requests per minute per IP. |
RATE_LIMIT_MCP_PER_MINUTE | 60 | MCP proxy requests per minute per IP. |
Rate limiting activates automatically as soon as both Upstash variables are set — no code changes needed. It is implemented against the Upstash REST API with zero extra npm dependencies and fails open if Redis is unreachable. Clients are identified by the
x-forwarded-for/x-real-ipheaders — make sure your reverse proxy (nginx, Caddy, …) overwrites these headers for untrusted requests, otherwise clients can spoof their rate-limit identity. For public deployments (e.g. Vercel), enabling it is recommended.
Ollama URL protection: on hosted deployments (detected via the
VERCELenvironment variable) a custom Ollama base URL must pass the same SSRF checks as MCP servers — it must be a public HTTPS endpoint. Locally this restriction does not apply, sohttp://127.0.0.1:11434/apikeeps working out of the box. If you self-host on a VPS behind a reverse proxy and want the same protection there, restrict/api/chatbodies or set up equivalent network-level guards.
Contributions are welcome! Please read our Contributing Guide for details on our code of conduct and the process for submitting pull requests.
This project is licensed under the MIT License - see the LICENSE file for details.
If you build something cool with this tool, please let us know! Open an issue or submit a PR to be featured here.
🌐 Brought to you by Own Your Website This playground is an open-source tool built and maintained by OwnYourWebsite - empowering developers and businesses with ready-to-deploy web solutions, embedded AI architectures, and full code ownership.
Main Ecosystem: ownyourwebsite.app
Live Playground: ai-playground.ownyourwebsite.app
5 commits
TypeScript
98.3%
CSS
1.5%
AI Playground by OwnYourWebsite
See the codeA developer-first, local-first LLM playground that integrates the Model Context Protocol (MCP) directly into your browser. Configure models, connect remote/hosted MCP servers, trace request/response payloads in raw JSON, and export production-ready snippets in seconds.
https://api.githubcopilot.com/mcp/) natively using your GitHub PAT.npm install
cp .env.example .env.local # optional: configure environment variables (see below)
npm run dev
Open http://localhost:3000 to view the workspace.
sk-...)sk-ant-...)gsk_...)http://127.0.0.1:11434/api)get_me, get_file_contents, etc.) will load instantly!Connect any remote MCP server — not just the built-in GitHub preset — by adding it directly in the right sidebar.
Tavily Search).https://mcp.tavily.com/mcp).Authorization: Bearer <your-key>. Use "+ Add header" to add more than
one (e.g. an API key header plus a version header).Example: Tavily's remote MCP (
https://mcp.tavily.com/mcp) works with a singleAuthorization: Bearer <your Tavily key>header. This is just one example among many — the app is intentionally vendor-neutral, so you can plug in any Streamable HTTP / SSE MCP server.
Security note: MCP tool output is untrusted content. The model should treat tool results as data, never as instructions. Review tool arguments before approving, and only connect servers you trust.
When a model "thinks" before answering, that hidden reasoning is surfaced in the Thought process accordion above each assistant reply. It is collapsed by default and shows a live "Thinking…" placeholder while it is still streaming.
The accordion is fed from two sources:
<think>, <thinking>, <reasoning>, and
<thought> are parsed client-side, stripped from the visible answer, and
shown under the accordion instead — with a fallback if a tag opens but never
closes.Reasoning content never bleeds into the main reply — the visible answer always stays clean.
Skills are reusable instruction presets / prompt templates shown in the left sidebar with an icon. Four built-in skills are seeded on first run:
| Skill | Icon |
|---|---|
| Repo Explorer | folder-tree |
| Code Reviewer | code |
| Debugger | bug |
| Data Analyst | database |
Clicking a skill opens an editable instruction preview and a "use GitHub MCP"
toggle. Apply places the instructions into the input box for your next
message. You can create custom skills (choose a name, an icon including
sparkles, instructions, and an optional GitHub MCP toggle) and delete custom
ones. Everything is stored locally in IndexedDB via getSkills / saveSkill /
deleteSkill.
All environment variables are optional — the app works out of the box with an empty .env.local. See .env.example for placeholders.
| Variable | Default | Description |
|---|---|---|
ALLOW_PRIVATE_MCP | (empty) | Set to 1 only for local development to allow http:// URLs and private/localhost MCP servers through the SSRF-shielded proxy (and to allow a local Ollama URL on hosted deployments). Never enable this on a publicly deployed instance (e.g. Vercel). |
UPSTASH_REDIS_REST_URL | (empty) | Upstash Redis REST endpoint. If both Upstash variables are empty, rate limiting is fully disabled. Create a free database at upstash.com → Redis → REST API details. |
UPSTASH_REDIS_REST_TOKEN | (empty) | Upstash Redis REST token (kept server-side only). |
RATE_LIMIT_CHAT_PER_MINUTE | 20 | Chat requests per minute per IP. |
RATE_LIMIT_MCP_PER_MINUTE | 60 | MCP proxy requests per minute per IP. |
Rate limiting activates automatically as soon as both Upstash variables are set — no code changes needed. It is implemented against the Upstash REST API with zero extra npm dependencies and fails open if Redis is unreachable. Clients are identified by the
x-forwarded-for/x-real-ipheaders — make sure your reverse proxy (nginx, Caddy, …) overwrites these headers for untrusted requests, otherwise clients can spoof their rate-limit identity. For public deployments (e.g. Vercel), enabling it is recommended.
Ollama URL protection: on hosted deployments (detected via the
VERCELenvironment variable) a custom Ollama base URL must pass the same SSRF checks as MCP servers — it must be a public HTTPS endpoint. Locally this restriction does not apply, sohttp://127.0.0.1:11434/apikeeps working out of the box. If you self-host on a VPS behind a reverse proxy and want the same protection there, restrict/api/chatbodies or set up equivalent network-level guards.
Contributions are welcome! Please read our Contributing Guide for details on our code of conduct and the process for submitting pull requests.
This project is licensed under the MIT License - see the LICENSE file for details.
If you build something cool with this tool, please let us know! Open an issue or submit a PR to be featured here.
🌐 Brought to you by Own Your Website This playground is an open-source tool built and maintained by OwnYourWebsite - empowering developers and businesses with ready-to-deploy web solutions, embedded AI architectures, and full code ownership.
Main Ecosystem: ownyourwebsite.app
Live Playground: ai-playground.ownyourwebsite.app
5 commits
TypeScript
98.3%
CSS
1.5%