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 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.2
15
+ ## What's New in 3.7.3
16
16
 
17
- 3.7.2 is a deployment and docs-polish patch release:
17
+ 3.7.3 is a hosted ChatGPT Apps patch release:
18
18
 
19
- - `semiotic-mcp --http` now runs in stateless Streamable HTTP mode, with JSON responses,
20
- health endpoints, optional `MCP_ALLOWED_HOSTS` host-header protection, and serverless-friendly
21
- request teardown.
22
- - `deploy/cloud-run` contains a minimal Google Cloud Run wrapper for publishing the MCP server as a
23
- public read-only connector for ChatGPT, Claude, and other MCP clients.
24
- - The Accessibility docs' visible navigation tree and bidirectional BarChart examples now honor
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`. In 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.
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
 
@@ -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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "name": "semiotic",
4
- "version": "3.7.2",
4
+ "version": "3.7.3",
5
5
  "description": "React data visualization library for charts, networks, and beyond",
6
6
  "tools": [
7
7
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "semiotic",
3
- "version": "3.7.2",
3
+ "version": "3.7.3",
4
4
  "mcpName": "io.github.nteract/semiotic",
5
5
  "description": "React data visualization library with built-in MCP server for AI-assisted chart generation",
6
6
  "main": "dist/semiotic.min.js",