semiotic 3.7.2 → 3.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -11
- package/ai/dist/mcp-server.js +9 -0
- package/ai/schema.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,17 +12,16 @@ Simple charts in 5 lines. Network graphs, streaming data, and coordinated
|
|
|
12
12
|
dashboards when you need them. Structured schemas and an MCP server so
|
|
13
13
|
AI coding assistants generate correct chart code on the first try.
|
|
14
14
|
|
|
15
|
-
## What's New in 3.7.
|
|
15
|
+
## What's New in 3.7.3
|
|
16
16
|
|
|
17
|
-
3.7.
|
|
17
|
+
3.7.3 is a hosted ChatGPT Apps patch release:
|
|
18
18
|
|
|
19
|
-
- `semiotic-mcp --http` now
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
dark mode, and the contested-annotations blog demo renders its editorial-status callouts reliably.
|
|
19
|
+
- `semiotic-mcp --http` can now serve the OpenAI Apps domain verification challenge from
|
|
20
|
+
`/.well-known/openai-apps-challenge` when `OPENAI_APPS_CHALLENGE_TOKEN` is configured.
|
|
21
|
+
- The Cloud Run wrapper docs now include the exact Challenge Base URL, token environment variable,
|
|
22
|
+
and `curl` check for ChatGPT Apps verification.
|
|
23
|
+
- MCP HTTP tests now cover the Apps challenge route while preserving the unauthenticated OAuth
|
|
24
|
+
discovery 404 behavior.
|
|
26
25
|
|
|
27
26
|
```jsx
|
|
28
27
|
import { LineChart } from "semiotic/xy"
|
|
@@ -423,13 +422,15 @@ Add to your MCP client config (e.g. `claude_desktop_config.json` for Claude Desk
|
|
|
423
422
|
}
|
|
424
423
|
```
|
|
425
424
|
|
|
426
|
-
No API keys or authentication required. The server runs locally via stdio. HTTP mode is also available for inspectors, web clients, and ChatGPT Apps SDK experiments: `npx semiotic-mcp --http --port 3001`.
|
|
425
|
+
No API keys or authentication required. The server runs locally via stdio. HTTP mode is also available for inspectors, web clients, and ChatGPT Apps SDK experiments: `npx semiotic-mcp --http --port 3001`. Since 3.7.2, HTTP mode is stateless: each request gets a fresh read-only MCP server + transport, so it can autoscale on serverless hosts without sticky sessions.
|
|
427
426
|
|
|
428
427
|
For ChatGPT developer mode, expose the HTTP endpoint over HTTPS with a tunnel and create a connector that points at `https://<your-tunnel>/mcp`. The experimental Apps SDK surface is `renderInteractiveChart`, which returns a `text/html;profile=mcp-app` widget template plus a hidden SVG payload rendered by Semiotic on the MCP server.
|
|
429
428
|
|
|
430
429
|
For a hosted deployment, see `deploy/cloud-run`. The wrapper runs the published `semiotic-mcp`
|
|
431
430
|
binary, exposes `/mcp` plus health endpoints, and supports `MCP_ALLOWED_HOSTS` for production
|
|
432
|
-
host-header allowlisting.
|
|
431
|
+
host-header allowlisting. For ChatGPT Apps domain verification, set
|
|
432
|
+
`OPENAI_APPS_CHALLENGE_TOKEN` so HTTP mode serves the raw token from
|
|
433
|
+
`/.well-known/openai-apps-challenge`.
|
|
433
434
|
|
|
434
435
|
### Tools
|
|
435
436
|
|
package/ai/dist/mcp-server.js
CHANGED
|
@@ -33854,6 +33854,7 @@ var port = Number.isFinite(parsedPort) ? parsedPort : 3001;
|
|
|
33854
33854
|
async function main() {
|
|
33855
33855
|
if (httpMode) {
|
|
33856
33856
|
const allowedHosts = (process.env.MCP_ALLOWED_HOSTS || "").split(",").map((h) => h.trim().toLowerCase()).filter(Boolean);
|
|
33857
|
+
const openaiAppsChallengeToken = (process.env.OPENAI_APPS_CHALLENGE_TOKEN || "").trim();
|
|
33857
33858
|
const healthBody = () => JSON.stringify({
|
|
33858
33859
|
status: "ok",
|
|
33859
33860
|
name: "semiotic-mcp",
|
|
@@ -33895,6 +33896,14 @@ async function main() {
|
|
|
33895
33896
|
res.end(healthBody());
|
|
33896
33897
|
return;
|
|
33897
33898
|
}
|
|
33899
|
+
if (req.method === "GET" && pathname === "/.well-known/openai-apps-challenge" && openaiAppsChallengeToken) {
|
|
33900
|
+
res.writeHead(200, {
|
|
33901
|
+
"Content-Type": "text/plain; charset=utf-8",
|
|
33902
|
+
"Cache-Control": "no-store"
|
|
33903
|
+
});
|
|
33904
|
+
res.end(openaiAppsChallengeToken);
|
|
33905
|
+
return;
|
|
33906
|
+
}
|
|
33898
33907
|
if (pathname !== "/" && pathname !== "/mcp") {
|
|
33899
33908
|
res.writeHead(404, { "Content-Type": "application/json" });
|
|
33900
33909
|
res.end(JSON.stringify({ error: "Not found" }));
|
package/ai/schema.json
CHANGED
package/package.json
CHANGED