tavus-cli 0.6.0__tar.gz → 0.8.0__tar.gz
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.
- tavus_cli-0.8.0/.agents/plugins/marketplace.json +12 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/.github/workflows/ci.yml +9 -0
- tavus_cli-0.8.0/.release-please-manifest.json +3 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/CHANGELOG.md +30 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/PKG-INFO +58 -13
- tavus_cli-0.8.0/PROMPT.md +65 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/README.md +57 -12
- tavus_cli-0.8.0/docs/chatgpt-plugin.md +165 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/docs/gemini-enterprise/test-queries.md +1 -1
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/packages/tavus/pyproject.toml +2 -2
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/packages/tavus-mcp/pyproject.toml +2 -2
- tavus_cli-0.8.0/plugins/tavus-pal/assets/icon-dark.svg +4 -0
- tavus_cli-0.8.0/plugins/tavus-pal/assets/icon.svg +4 -0
- tavus_cli-0.8.0/plugins/tavus-pal/mcp.json +9 -0
- tavus_cli-0.8.0/plugins/tavus-pal/plugin.json +45 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/pyproject.toml +1 -1
- tavus_cli-0.8.0/scripts/build_chatgpt_plugin.py +46 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/skills/tavus-agentic-pals/SKILL.md +12 -4
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/__init__.py +1 -1
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/cli/main.py +124 -8
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/client/http.py +3 -7
- tavus_cli-0.8.0/src/tavus_mcp/sdk/recipes/deployments.py +216 -0
- tavus_cli-0.8.0/src/tavus_mcp/sdk/schemas/deployment.py +106 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/schemas/guardrail.py +4 -4
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/schemas/pal.py +0 -1
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/server.py +122 -5
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/integration/test_cli.py +12 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/integration/test_mcp_server.py +125 -0
- tavus_cli-0.8.0/tests/unit/test_deployments.py +189 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/uv.lock +1 -1
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/package-lock.json +4 -2
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/package.json +3 -1
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/src/index.ts +8 -6
- tavus_cli-0.8.0/workers/tavus-mcp/src/oauth-session.ts +151 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/src/oauth.ts +185 -99
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/src/tavus.ts +395 -35
- tavus_cli-0.8.0/workers/tavus-mcp/src/version.ts +1 -0
- tavus_cli-0.8.0/workers/tavus-mcp/test/oauth-session.test.ts +366 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/test/tavus.test.ts +265 -59
- tavus_cli-0.8.0/workers/tavus-mcp/test/worker-runtime.ts +41 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/wrangler.jsonc +10 -5
- tavus_cli-0.6.0/.release-please-manifest.json +0 -3
- tavus_cli-0.6.0/workers/tavus-mcp/src/version.ts +0 -1
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/.env.example +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/.github/workflows/deploy-cloudflare-worker.yml +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/.github/workflows/pr-reviews.yml +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/.github/workflows/pypi-cli.yml +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/.github/workflows/tail-cloudflare-worker.yml +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/.github/workflows/validate-staging-deployment.yml +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/.gitignore +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/AGENTS.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/docs/gemini-enterprise/README.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/docs/gemini-enterprise/listing.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/docs/usage-observability.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/packages/tavus/README.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/packages/tavus-mcp/README.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/release-please-config.json +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/scripts/__init__.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/scripts/check_release_versions.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/skills/tavus-agentic-pals/agents/openai.yaml +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/skills/tavus-agentic-pals/references/build-and-verify.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/skills/tavus-agentic-pals/references/builder-workflow.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/skills/tavus-agentic-pals/references/chat-mode.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/skills/tavus-agentic-pals/references/examples.md +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/cli/__init__.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/__init__.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/auth/__init__.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/auth/keyring_store.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/auth/oauth.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/auth/session.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/client/__init__.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/daily_transport.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/env.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/errors.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/pal_urls.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/patch.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/__init__.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/build_and_verify.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/capabilities.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/carrier_builder.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/knowledge.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/options.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/quickstart.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/scaffold_embed.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/templates.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/recipes/tool_reuse.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/schemas/__init__.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/schemas/file_manifest.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/schemas/objective.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/schemas/pronunciation.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/src/tavus_mcp/sdk/schemas/tool.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/conftest.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/integration/test_client.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/integration/test_oauth.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_auth.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_build_and_verify.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_builder.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_capabilities.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_daily_transport.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_env.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_guardrail_schema.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_objective_schema.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_pal_schema.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_patch.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_pronunciation_schema.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_release_versions.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_scaffold_embed.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_tool_reuse.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/tests/unit/test_tool_schema.py +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/.dev.vars.example +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/src/oauth-grant.ts +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/test/parity.test.ts +0 -0
- {tavus_cli-0.6.0 → tavus_cli-0.8.0}/workers/tavus-mcp/tsconfig.json +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tavus",
|
|
3
|
+
"interface": { "displayName": "Tavus" },
|
|
4
|
+
"plugins": [
|
|
5
|
+
{
|
|
6
|
+
"name": "tavus-pal",
|
|
7
|
+
"source": { "source": "local", "path": "./plugins/tavus-pal" },
|
|
8
|
+
"policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" },
|
|
9
|
+
"category": "Developer Tools"
|
|
10
|
+
}
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -41,6 +41,15 @@ jobs:
|
|
|
41
41
|
run: uv run pytest -q
|
|
42
42
|
- name: Build
|
|
43
43
|
run: uv build
|
|
44
|
+
- name: Build ChatGPT plugin package
|
|
45
|
+
run: python scripts/build_chatgpt_plugin.py
|
|
46
|
+
- name: Upload ChatGPT plugin package
|
|
47
|
+
if: matrix.python-version == '3.13'
|
|
48
|
+
uses: actions/upload-artifact@v4
|
|
49
|
+
with:
|
|
50
|
+
name: tavus-pal-plugin
|
|
51
|
+
path: dist/tavus-pal-*.zip
|
|
52
|
+
if-no-files-found: error
|
|
44
53
|
|
|
45
54
|
worker:
|
|
46
55
|
runs-on: ubuntu-latest
|
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.8.0](https://github.com/Tavus-Engineering/tavus-mcp/compare/v0.7.0...v0.8.0) (2026-10-08)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* create deployments from MCP so agents can put a PAL on a site ([#59](https://github.com/Tavus-Engineering/tavus-mcp/issues/59)) ([15079b3](https://github.com/Tavus-Engineering/tavus-mcp/commit/15079b3ce3dc941a6c59ad5278241923a93e715d))
|
|
9
|
+
* **worker:** accept sign-in from VS Code, v0, Lovable and Replit ([#61](https://github.com/Tavus-Engineering/tavus-mcp/issues/61)) ([c220a74](https://github.com/Tavus-Engineering/tavus-mcp/commit/c220a74cb8835767583adf242586c4b2484dea4d))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* **guardrails:** let the hosted server patch guardrail_ids and drop guardrails_id ([#12](https://github.com/Tavus-Engineering/tavus-mcp/issues/12)) ([ae389a5](https://github.com/Tavus-Engineering/tavus-mcp/commit/ae389a5399eae609f416b59a59b4e77dd3001a37))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Documentation
|
|
18
|
+
|
|
19
|
+
* add a coding-agent prompt for the MCP server ([#58](https://github.com/Tavus-Engineering/tavus-mcp/issues/58)) ([293f2eb](https://github.com/Tavus-Engineering/tavus-mcp/commit/293f2eb6d8804f85cc444382cbf9cd84ee2598e4))
|
|
20
|
+
|
|
21
|
+
## [0.7.0](https://github.com/Tavus-Engineering/tavus-mcp/compare/v0.6.0...v0.7.0) (2026-10-07)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* package Tavus PAL plugin with delegated OAuth sessions ([#53](https://github.com/Tavus-Engineering/tavus-mcp/issues/53)) ([8479143](https://github.com/Tavus-Engineering/tavus-mcp/commit/8479143bc05a1e4016ae9cfdc1359aebaf69714e))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Bug Fixes
|
|
30
|
+
|
|
31
|
+
* keep hosted MCP connections signed in ([#57](https://github.com/Tavus-Engineering/tavus-mcp/issues/57)) ([02e5eee](https://github.com/Tavus-Engineering/tavus-mcp/commit/02e5eee8992f8f77423d454469127456cd2a74ee))
|
|
32
|
+
|
|
3
33
|
## [0.6.0](https://github.com/Tavus-Engineering/tavus-mcp/compare/v0.5.0...v0.6.0) (2026-10-07)
|
|
4
34
|
|
|
5
35
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: tavus-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.0
|
|
4
4
|
Summary: Tavus CLI and MCP server for agentic PAL creation and editing.
|
|
5
5
|
Requires-Python: >=3.11
|
|
6
6
|
Requires-Dist: fastmcp>=2.0.0
|
|
@@ -29,8 +29,9 @@ MCP-aware client) drive the same platform through the API:
|
|
|
29
29
|
- **MCP server.** The full PAL surface as MCP tools: the guided build
|
|
30
30
|
(`tavus_pal_build_and_verify`), chat-mode text testing, and CRUD for PALs,
|
|
31
31
|
tools, knowledge, guardrails, objectives, pronunciation dictionaries,
|
|
32
|
-
capabilities, faces, and voices
|
|
33
|
-
|
|
32
|
+
capabilities, faces, and voices, plus deployments that put a PAL on a
|
|
33
|
+
landing page, an embed or a widget. Run it locally over stdio, or connect
|
|
34
|
+
to the hosted server at `https://mcp.tavus.io/mcp`.
|
|
34
35
|
- **`tavus` CLI.** The same surface as shell commands, published to PyPI as
|
|
35
36
|
[`tavus-cli`](https://pypi.org/project/tavus-cli/). Scripted PAL authoring
|
|
36
37
|
and publishing, JSON round-tripping, browser login with OS-keychain storage.
|
|
@@ -53,10 +54,45 @@ claude mcp add -s user --transport http tavus https://mcp.tavus.io/mcp
|
|
|
53
54
|
Claude.ai and ChatGPT custom connectors use the same URL. Do not put a Tavus
|
|
54
55
|
API key or shared bearer token in client config: the Worker exposes standard
|
|
55
56
|
OAuth metadata and dynamic client registration, so the client sends you
|
|
56
|
-
through Tavus browser sign-in. The developer portal mints a per-user API key
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
through Tavus browser sign-in. The developer portal mints a per-user API key;
|
|
58
|
+
the Worker keeps it encrypted server-side and issues expiring OAuth tokens.
|
|
59
|
+
The API key never appears in client configuration or browser callback URLs.
|
|
60
|
+
|
|
61
|
+
Dynamic client registration accepts loopback callbacks from any local client
|
|
62
|
+
(Claude Code, Codex, Gemini CLI) and the hosted callbacks of Claude, ChatGPT,
|
|
63
|
+
Cursor, VS Code, v0, Lovable and Replit. They are listed in `KNOWN_REMOTE_CLIENTS` in
|
|
64
|
+
`workers/tavus-mcp/src/oauth.ts`. To add a client, press Connect in it once,
|
|
65
|
+
read its callback from the Worker's `oauth_register_rejected` log line, and add
|
|
66
|
+
an entry with a test. Clients that don't use dynamic registration, such as
|
|
67
|
+
Gemini Enterprise, get a client ID and secret through the `MCP_OAUTH_CLIENTS`
|
|
68
|
+
secret, with their callback in `redirect_uris` (for Gemini Enterprise,
|
|
69
|
+
`https://vertexaisearch.cloud.google.com/oauth-redirect`).
|
|
70
|
+
|
|
71
|
+
`PROMPT.md` is the prompt for coding agents working with Tavus through this
|
|
72
|
+
server. Paste it into Claude Code, Codex or Cursor: it gets the client
|
|
73
|
+
connected, asks what the user wants to build, and states the contracts for
|
|
74
|
+
building, changing and testing a PAL and wiring its tools into the user's code.
|
|
75
|
+
Put a known PAL id or tool list above it and the agent will not ask for them.
|
|
76
|
+
When the user wants the PAL in front of people, the agent suggests a landing
|
|
77
|
+
page, embed or widget from the project, creates the deployment with
|
|
78
|
+
`tavus_deployment_create`, and either shares the landing page link or hands
|
|
79
|
+
off to the embed or widget prompt in tavus-examples
|
|
80
|
+
(`examples/embed-prompt.md`, `examples/widget-prompt.md`) with the
|
|
81
|
+
deployment id and the PAL's page tools already filled in.
|
|
82
|
+
|
|
83
|
+
### ChatGPT plugin
|
|
84
|
+
|
|
85
|
+
`plugins/tavus-pal/` packages this same hosted server as **Tavus PAL** for
|
|
86
|
+
ChatGPT and Codex. It adds listing metadata and Tavus icons; tools and account
|
|
87
|
+
authorization continue to live in the Worker. Build the uploadable ZIP with:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
python scripts/build_chatgpt_plugin.py
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
The repository marketplace is `.agents/plugins/marketplace.json`. See
|
|
94
|
+
[ChatGPT setup and release guide](docs/chatgpt-plugin.md) for installation,
|
|
95
|
+
authentication, migration, and directory submission.
|
|
60
96
|
|
|
61
97
|
## Local MCP server
|
|
62
98
|
|
|
@@ -132,6 +168,7 @@ Command groups:
|
|
|
132
168
|
| `tavus guardrail`, `tavus objective`, `tavus tool`, `tavus pronunciation-dictionary` | CRUD for each resource |
|
|
133
169
|
| `tavus face`, `tavus resource`, `tavus skill` | account resource discovery |
|
|
134
170
|
| `tavus conversation` | create or end CVI conversations |
|
|
171
|
+
| `tavus deployment` | `list`, `get`, `create` — put a PAL on a landing page, an embed or a widget |
|
|
135
172
|
| `tavus auth`, `tavus doctor`, `tavus quickstart`, `tavus embed` | login, environment checks, one-call PAL + conversation, embed scaffolding |
|
|
136
173
|
|
|
137
174
|
Examples:
|
|
@@ -265,12 +302,20 @@ The authorize step redirects to the developer portal at
|
|
|
265
302
|
`/dev/cli-authorize?mode=oauth`. The portal verifies the Worker's signed
|
|
266
303
|
request, shows the connector destination, and after sign-in posts a per-user
|
|
267
304
|
API key to the Worker's trusted `/oauth/callback`. The Worker issues an
|
|
268
|
-
|
|
269
|
-
redirect, and MCP resource at `/token`,
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
305
|
+
short-lived authorization code, verifies PKCE plus the registered client,
|
|
306
|
+
redirect, and MCP resource at `/token`, and issues a 15-minute opaque access
|
|
307
|
+
token and rotating refresh token. The account API key stays encrypted in a
|
|
308
|
+
SQLite-backed Durable Object; only token hashes are stored. Each MCP request
|
|
309
|
+
validates the token's resource, scope, and expiry before using the linked key.
|
|
310
|
+
Authorization requests and codes remain one-time grants.
|
|
311
|
+
|
|
312
|
+
Sessions do not expire. A session ends when `POST /revoke` revokes it, or when
|
|
313
|
+
a refresh token is reused more than 60 seconds after its first use. A reuse
|
|
314
|
+
within 60 seconds, such as a retry or two concurrent refreshes, gets new tokens.
|
|
315
|
+
A Tavus API key sent directly as the bearer token still works, so connections
|
|
316
|
+
made before OAuth sessions existed keep working. Native CLI sign-in is
|
|
317
|
+
unchanged. See [migration and rollout](docs/chatgpt-plugin.md#authentication-and-rollout)
|
|
318
|
+
before deploying.
|
|
274
319
|
|
|
275
320
|
### Local and hosted parity
|
|
276
321
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
You are working with Tavus from this coding session through the Tavus MCP server: building and changing PALs (Tavus's AI personas that hold real-time, face-to-face video conversations), giving them tools that act in my app, and testing them. The server is hosted at `https://mcp.tavus.io/mcp` and exposes `tavus_*` tools that read and write my Tavus account. The tools return data and file manifests; they never write files. You write any code into my repo yourself.
|
|
2
|
+
|
|
3
|
+
Before anything else, check that the `tavus_*` tools are available to you. If they are not, give me the one setup step for my client and stop until I have done it:
|
|
4
|
+
|
|
5
|
+
- Claude Code: `claude mcp add -s user --transport http tavus https://mcp.tavus.io/mcp`
|
|
6
|
+
- Codex: `codex mcp add tavus --url https://mcp.tavus.io/mcp`, then `codex mcp login tavus`
|
|
7
|
+
- Cursor and other MCP clients: add `https://mcp.tavus.io/mcp` as a remote (HTTP) MCP server named `tavus`
|
|
8
|
+
- Claude.ai and ChatGPT: add a custom connector with the same URL
|
|
9
|
+
|
|
10
|
+
Sign-in happens in the browser on first use, with my Tavus account. Some clients need a restart before new tools show up. Once the tools are there, call `tavus_mcp_health_check` and continue only when it passes.
|
|
11
|
+
|
|
12
|
+
Then read the reference pages below (the `.md` URLs return plain markdown) and ask me these things:
|
|
13
|
+
|
|
14
|
+
1. What we are doing. One of these, a mix, or something else entirely:
|
|
15
|
+
(a) build a new PAL from my description,
|
|
16
|
+
(b) change a PAL I already have (its prompt, greeting, objectives, guardrails, knowledge, capabilities, face or voice),
|
|
17
|
+
(c) give a PAL tools that act in my app or call my backend, and write the code in this repo that handles them,
|
|
18
|
+
(d) test a PAL by text against specific questions,
|
|
19
|
+
(e) put a PAL in front of people: inside this app, on my website, or as a link I can share,
|
|
20
|
+
(f) your own idea, described in your words.
|
|
21
|
+
If I am not sure what to build, look at this repo, then suggest what fits and say why.
|
|
22
|
+
2. Which PAL, for anything other than a new one, unless its id is already given above this prompt or came from a build earlier in this session; then use it and do not ask. If I do not know the id, list my PALs with `tavus_pal_list` and `sort: "desc"` (newest first) and let me pick. Do not invent an id.
|
|
23
|
+
3. For tools, unless they are already listed above this prompt: what each one should do, and whether it runs on the page (in the browser, next to the conversation) or on my backend (a URL Tavus calls). Look at this repo before asking, since the answer is often in the code.
|
|
24
|
+
|
|
25
|
+
How the server works
|
|
26
|
+
|
|
27
|
+
- One account, production. The hosted server acts on the Tavus account I signed in with, against the production API. There is no environment switch and no API key in the client config.
|
|
28
|
+
- Everything on a PAL is a resource with an id: faces, voices, guardrails, objectives, Knowledge documents, tools. Get ids from the matching list call (`tavus_face_list`, `tavus_voice_list`, `tavus_guardrail_list`, `tavus_objective_list`, `tavus_document_list`, `tavus_tool_list`) or from `tavus_describe_pal_options`, which returns one PAL with everything attachable to it.
|
|
29
|
+
- Tools are first-class records. A tool is created once with `tavus_tool_create` and attached with `tavus_pal_tools_attach`. Writing tools inline under `layers.llm.tools` is rejected.
|
|
30
|
+
- The five PAL Maker capabilities (Magic Canvas, Slide Presenter, Web Search, Perception, Memory) go through `tavus_pal_capability_attach`, `tavus_pal_capability_patch` and `tavus_pal_capability_detach`, not raw patches.
|
|
31
|
+
- Every conversation is billed like any other, including the build's own test turns, chat-mode tests and previews.
|
|
32
|
+
|
|
33
|
+
How to do the common things properly
|
|
34
|
+
|
|
35
|
+
These are the contracts the server keeps. Exact parameters and response shapes are in the reference below; the order of operations is here, because that is what tends to get invented.
|
|
36
|
+
|
|
37
|
+
- Building a new PAL. Use `tavus_pal_build_and_verify`; it is the standard path. You run the interview first: ask me plain questions, up to 12, about who the PAL talks to, what a good conversation achieves, the tone, what it must never say or do, what it should know (links to documents), and what it should do in my app. Ask only what my description leaves open. Pass my description as `prompt`, the questions and my answers as `interview`, and your summary of each part as `briefs`. The call takes one to three minutes. It drafts the personality, objectives, guardrails and greeting, picks a face unless I asked for one (`face_id`), publishes the PAL, runs test conversations and judges them. Read `verdict.overall` (`pass`, `partial` or `fail`), then the summary and any failing evidence, before you tell me it works. Tools can only be attached once the PAL exists, so the build's test turns run without them and tool checks in the verdict fail; attach the tools, then rerun those turns with chat mode before you tell me the tools work. Give me the `pal_url` it returns; that opens the PAL in the PAL Maker. Use `tavus_pal_create` or `tavus_quickstart` only when I hand you a finished system prompt and ask you to skip the build.
|
|
38
|
+
- Changing an existing PAL. Call `tavus_pal_get` and `tavus_describe_pal_options` first, and take ids and patch paths from what they return. Make the smallest change with `tavus_patch_pal` (JSON Patch operations such as `replace` on `/greeting`), or use the dedicated tools for capabilities, Knowledge and tools. A change applies to every conversation the PAL starts from then on, including on my live site, so tell me what will change and get a yes before patching a PAL that is already in use.
|
|
39
|
+
- Giving the PAL a tool. Check `tavus_tool_list` first and attach an existing tool when its name, parameters and delivery fit. When you create a new one that overlaps an existing tool, tell me which tool you saw and why it does not fit. The tool's `description` is what tells the PAL when to call it, so write it as an instruction. `delivery` decides where the call goes: `{ "app_message": true }` (the default) sends it to the page running the conversation, and `delivery.api` makes Tavus call a backend URL. Then write the handler in this repo with the exact tool name and parameter schema, so the two halves match. On a page that uses `<tavus-embed>` or `<tavus-widget>`, the call arrives as `tavus:tool-call` `{ name, arguments, tool_call_id }` with `arguments` as a JSON string, and the page replies with `sendMessage({ event_type: "conversation.tool_result", properties: { tool_call_id, output, status: "success" } })`; the host communication page below has the full contract. A tool that is not attached to the PAL never fires, however the code is wired.
|
|
40
|
+
- Giving the PAL knowledge. Create a Knowledge document from a URL anyone can reach with `tavus_document_create`, then attach it with `tavus_pal_knowledge_add`. The hosted server cannot read files on my machine; for a local file, ask me to upload it in the PAL Maker's Knowledge section or to host it at a URL. Before you tell me what a document says, read what Tavus indexed with `tavus_document_chunks`.
|
|
41
|
+
- Testing by text. `tavus_chat_start` starts a text-only conversation with the PAL, `tavus_chat_turn` sends one message and waits for the reply, and `tavus_chat_end` ends it. Always end the conversations you start. The first turn is slower while the conversation starts up. Replies are not deterministic, so judge behaviour (did it ask for the order number, did it refuse the pricing promise) rather than exact wording.
|
|
42
|
+
- Seeing it on video. `tavus_pal_preview` starts a full video conversation and returns its URL for me to open. Do it after the text tests pass, and only when I want to see or hear the PAL.
|
|
43
|
+
- Putting the PAL in front of people. A deployment is what makes a PAL reachable, and there are three kinds. A landing page is a page Tavus hosts, with its own link, for when there is no site in this repo or I want something to send around. Embed puts the conversation inside a page of my app: a section, a card, a step in a flow. Widget is a floating launcher on every page of my site. Pick one from what this repo is, propose it with a reason, and let me decide. If I want the PAL to act on the page (open a product, fill a form), create and attach those tools before deploying, so the handoff below includes them.
|
|
44
|
+
- Creating the deployment. Call `tavus_deployment_list` with the PAL id first and offer to reuse a deployment that already fits. Otherwise ask me what `tavus_deployment_create` needs: whether each visitor gets their own memory of past calls; for embed or widget, where the site is hosted, as origins such as `https://www.example.com`, plus `http://localhost:<port>` from this repo's dev server if I want to try it locally (an empty list lets any site load it); for a landing page, a headline and one sentence you draft from what the PAL does; and how much use to allow, since every call is billed and a deployment has no limits unless I set them: calls per day across all visitors, calls per day per visitor, calls at the same moment, and the longest a call may last. Suggest numbers that fit what I am building, and let me say no limit. A deployment is live and public as soon as it is created, so show me these values and get a yes first.
|
|
45
|
+
- Handing off. `tavus_deployment_create` returns an `integration` block. For a landing page, give me `landing_page_url`. For embed or widget, read `prompt_url` and follow that prompt with `prompt_header` placed above it, so it does not ask for the deployment id or the page tools again; write a handler for every entry in `page_tools`, reusing any handler you already wrote in this session. When the PAL's tools change later, `tavus_deployment_get` returns the current list. Changing a deployment's settings or taking it down happens in the [Tavus PAL Maker](https://maker.tavus.io). Do not use `tavus_scaffold_embed` for a site: it wraps the URL of a single conversation, which stops working when that conversation ends.
|
|
46
|
+
|
|
47
|
+
Not possible, not needed, or not yours to do
|
|
48
|
+
|
|
49
|
+
- Do not ask me for an API key, and do not put one in the MCP config, an env file or the chat. Sign-in is the browser flow above.
|
|
50
|
+
- Changing or taking down a deployment, billing, team members and account settings are not available through the MCP server. Send me to the PAL Maker or the developer portal for those.
|
|
51
|
+
- Do not invent ids for PALs, faces, voices, guardrails, objectives, documents or tools. Every id comes from a list or get call.
|
|
52
|
+
- Do not delete PALs, tools, guardrails, objectives, documents or pronunciation dictionaries, and do not end conversations you did not start, unless I ask for that exact action.
|
|
53
|
+
- Do not retry a failed write in a loop. Read the error; if it looks like sign-in or connectivity, call `tavus_mcp_health_check` and tell me what it says.
|
|
54
|
+
- Tool names and parameters are exactly what the server lists. If a tool is not in your tool list, it does not exist.
|
|
55
|
+
|
|
56
|
+
Reference, current and authoritative; this prompt is not a substitute for it:
|
|
57
|
+
|
|
58
|
+
- Connecting a client, tool delivery to the page or a backend: https://docs.tavus.io/sections/agent-tools/mcp-server.md
|
|
59
|
+
- Every MCP tool and its parameters: https://docs.tavus.io/sections/agent-tools/mcp-tools-reference.md
|
|
60
|
+
- The guided build and how to read its verdict: https://docs.tavus.io/sections/agent-tools/pal-build-and-verify.md
|
|
61
|
+
- Handling tool calls on a page with `<tavus-embed>` or `<tavus-widget>`: https://docs.tavus.io/sections/deployments/host-communication.md
|
|
62
|
+
- Coding-agent prompt for `<tavus-embed>`: https://raw.githubusercontent.com/Tavus-Engineering/tavus-examples/main/examples/embed-prompt.md
|
|
63
|
+
- Coding-agent prompt for `<tavus-widget>`: https://raw.githubusercontent.com/Tavus-Engineering/tavus-examples/main/examples/widget-prompt.md
|
|
64
|
+
- Deployments: https://docs.tavus.io/sections/deployments/landing-page.md, https://docs.tavus.io/sections/deployments/embed.md and https://docs.tavus.io/sections/deployments/widget.md
|
|
65
|
+
- Full documentation index: https://docs.tavus.io/llms.txt
|
|
@@ -7,8 +7,9 @@ MCP-aware client) drive the same platform through the API:
|
|
|
7
7
|
- **MCP server.** The full PAL surface as MCP tools: the guided build
|
|
8
8
|
(`tavus_pal_build_and_verify`), chat-mode text testing, and CRUD for PALs,
|
|
9
9
|
tools, knowledge, guardrails, objectives, pronunciation dictionaries,
|
|
10
|
-
capabilities, faces, and voices
|
|
11
|
-
|
|
10
|
+
capabilities, faces, and voices, plus deployments that put a PAL on a
|
|
11
|
+
landing page, an embed or a widget. Run it locally over stdio, or connect
|
|
12
|
+
to the hosted server at `https://mcp.tavus.io/mcp`.
|
|
12
13
|
- **`tavus` CLI.** The same surface as shell commands, published to PyPI as
|
|
13
14
|
[`tavus-cli`](https://pypi.org/project/tavus-cli/). Scripted PAL authoring
|
|
14
15
|
and publishing, JSON round-tripping, browser login with OS-keychain storage.
|
|
@@ -31,10 +32,45 @@ claude mcp add -s user --transport http tavus https://mcp.tavus.io/mcp
|
|
|
31
32
|
Claude.ai and ChatGPT custom connectors use the same URL. Do not put a Tavus
|
|
32
33
|
API key or shared bearer token in client config: the Worker exposes standard
|
|
33
34
|
OAuth metadata and dynamic client registration, so the client sends you
|
|
34
|
-
through Tavus browser sign-in. The developer portal mints a per-user API key
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
through Tavus browser sign-in. The developer portal mints a per-user API key;
|
|
36
|
+
the Worker keeps it encrypted server-side and issues expiring OAuth tokens.
|
|
37
|
+
The API key never appears in client configuration or browser callback URLs.
|
|
38
|
+
|
|
39
|
+
Dynamic client registration accepts loopback callbacks from any local client
|
|
40
|
+
(Claude Code, Codex, Gemini CLI) and the hosted callbacks of Claude, ChatGPT,
|
|
41
|
+
Cursor, VS Code, v0, Lovable and Replit. They are listed in `KNOWN_REMOTE_CLIENTS` in
|
|
42
|
+
`workers/tavus-mcp/src/oauth.ts`. To add a client, press Connect in it once,
|
|
43
|
+
read its callback from the Worker's `oauth_register_rejected` log line, and add
|
|
44
|
+
an entry with a test. Clients that don't use dynamic registration, such as
|
|
45
|
+
Gemini Enterprise, get a client ID and secret through the `MCP_OAUTH_CLIENTS`
|
|
46
|
+
secret, with their callback in `redirect_uris` (for Gemini Enterprise,
|
|
47
|
+
`https://vertexaisearch.cloud.google.com/oauth-redirect`).
|
|
48
|
+
|
|
49
|
+
`PROMPT.md` is the prompt for coding agents working with Tavus through this
|
|
50
|
+
server. Paste it into Claude Code, Codex or Cursor: it gets the client
|
|
51
|
+
connected, asks what the user wants to build, and states the contracts for
|
|
52
|
+
building, changing and testing a PAL and wiring its tools into the user's code.
|
|
53
|
+
Put a known PAL id or tool list above it and the agent will not ask for them.
|
|
54
|
+
When the user wants the PAL in front of people, the agent suggests a landing
|
|
55
|
+
page, embed or widget from the project, creates the deployment with
|
|
56
|
+
`tavus_deployment_create`, and either shares the landing page link or hands
|
|
57
|
+
off to the embed or widget prompt in tavus-examples
|
|
58
|
+
(`examples/embed-prompt.md`, `examples/widget-prompt.md`) with the
|
|
59
|
+
deployment id and the PAL's page tools already filled in.
|
|
60
|
+
|
|
61
|
+
### ChatGPT plugin
|
|
62
|
+
|
|
63
|
+
`plugins/tavus-pal/` packages this same hosted server as **Tavus PAL** for
|
|
64
|
+
ChatGPT and Codex. It adds listing metadata and Tavus icons; tools and account
|
|
65
|
+
authorization continue to live in the Worker. Build the uploadable ZIP with:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
python scripts/build_chatgpt_plugin.py
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The repository marketplace is `.agents/plugins/marketplace.json`. See
|
|
72
|
+
[ChatGPT setup and release guide](docs/chatgpt-plugin.md) for installation,
|
|
73
|
+
authentication, migration, and directory submission.
|
|
38
74
|
|
|
39
75
|
## Local MCP server
|
|
40
76
|
|
|
@@ -110,6 +146,7 @@ Command groups:
|
|
|
110
146
|
| `tavus guardrail`, `tavus objective`, `tavus tool`, `tavus pronunciation-dictionary` | CRUD for each resource |
|
|
111
147
|
| `tavus face`, `tavus resource`, `tavus skill` | account resource discovery |
|
|
112
148
|
| `tavus conversation` | create or end CVI conversations |
|
|
149
|
+
| `tavus deployment` | `list`, `get`, `create` — put a PAL on a landing page, an embed or a widget |
|
|
113
150
|
| `tavus auth`, `tavus doctor`, `tavus quickstart`, `tavus embed` | login, environment checks, one-call PAL + conversation, embed scaffolding |
|
|
114
151
|
|
|
115
152
|
Examples:
|
|
@@ -243,12 +280,20 @@ The authorize step redirects to the developer portal at
|
|
|
243
280
|
`/dev/cli-authorize?mode=oauth`. The portal verifies the Worker's signed
|
|
244
281
|
request, shows the connector destination, and after sign-in posts a per-user
|
|
245
282
|
API key to the Worker's trusted `/oauth/callback`. The Worker issues an
|
|
246
|
-
|
|
247
|
-
redirect, and MCP resource at `/token`,
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
283
|
+
short-lived authorization code, verifies PKCE plus the registered client,
|
|
284
|
+
redirect, and MCP resource at `/token`, and issues a 15-minute opaque access
|
|
285
|
+
token and rotating refresh token. The account API key stays encrypted in a
|
|
286
|
+
SQLite-backed Durable Object; only token hashes are stored. Each MCP request
|
|
287
|
+
validates the token's resource, scope, and expiry before using the linked key.
|
|
288
|
+
Authorization requests and codes remain one-time grants.
|
|
289
|
+
|
|
290
|
+
Sessions do not expire. A session ends when `POST /revoke` revokes it, or when
|
|
291
|
+
a refresh token is reused more than 60 seconds after its first use. A reuse
|
|
292
|
+
within 60 seconds, such as a retry or two concurrent refreshes, gets new tokens.
|
|
293
|
+
A Tavus API key sent directly as the bearer token still works, so connections
|
|
294
|
+
made before OAuth sessions existed keep working. Native CLI sign-in is
|
|
295
|
+
unchanged. See [migration and rollout](docs/chatgpt-plugin.md#authentication-and-rollout)
|
|
296
|
+
before deploying.
|
|
252
297
|
|
|
253
298
|
### Local and hosted parity
|
|
254
299
|
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Tavus PAL for ChatGPT
|
|
2
|
+
|
|
3
|
+
Tavus PAL packages the existing hosted MCP server for ChatGPT and Codex.
|
|
4
|
+
It uses `https://mcp.tavus.io/mcp` directly, so every hosted tool keeps its
|
|
5
|
+
existing implementation, schema, account, and API behavior. There is no
|
|
6
|
+
second server or copied tool registry to maintain.
|
|
7
|
+
|
|
8
|
+
## Build and install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
python scripts/build_chatgpt_plugin.py
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
This produces `dist/tavus-pal-0.1.0.zip`. The ZIP contains only `plugin.json`,
|
|
15
|
+
`mcp.json`, and two square SVG icons derived from the portal's Tavus favicon.
|
|
16
|
+
No account credentials, local environment files, or test evidence are bundled.
|
|
17
|
+
The portable Agent Plugins schemas validate both manifests. The package has
|
|
18
|
+
its own version because listing changes do not require an MCP server release.
|
|
19
|
+
|
|
20
|
+
For local distribution, the repository's `.agents/plugins/marketplace.json`
|
|
21
|
+
points to `plugins/tavus-pal`. Add the repository root as a local marketplace
|
|
22
|
+
in a supported ChatGPT/Codex desktop client, then install Tavus PAL from that
|
|
23
|
+
source. Account linking still uses Tavus OAuth.
|
|
24
|
+
|
|
25
|
+
For a browser-only test, open ChatGPT Plugins, add a custom MCP server with
|
|
26
|
+
the URL above, choose OAuth with dynamic client registration (DCR), and complete
|
|
27
|
+
Tavus sign-in. Do not enter API keys in a prompt or plugin configuration.
|
|
28
|
+
If a Tavus connection already exists, refresh its tools before testing.
|
|
29
|
+
|
|
30
|
+
For directory distribution, upload the ZIP to the OpenAI Plugins dashboard
|
|
31
|
+
under the verified Tavus publishing identity. A package upload is a draft;
|
|
32
|
+
review approval and publication are separate steps. Reuse an existing Tavus
|
|
33
|
+
listing when appropriate rather than creating a duplicate.
|
|
34
|
+
|
|
35
|
+
## What the plugin supports
|
|
36
|
+
|
|
37
|
+
The current hosted server exposes 67 tools. It can create and edit PALs,
|
|
38
|
+
choose available faces and voices, attach knowledge and capabilities, configure
|
|
39
|
+
guardrails and objectives, run text conversations, and return a browser video
|
|
40
|
+
preview URL. The guided build tool drafts and publishes a PAL and evaluates
|
|
41
|
+
conversation probes. Creation, building, and conversations use the connected
|
|
42
|
+
Tavus account's existing entitlements and may consume Tavus usage.
|
|
43
|
+
|
|
44
|
+
This is a conversational digital-human integration. The hosted tool set does
|
|
45
|
+
not include custom face/replica training, asynchronous rendered-video generation,
|
|
46
|
+
PAL marketplace listings, purchase, or ownership transfer. Hosted MCP also
|
|
47
|
+
cannot read local file paths; Python-only upload and builder-administration
|
|
48
|
+
tools remain the documented parity exceptions.
|
|
49
|
+
|
|
50
|
+
The package does not add an embedded video widget. Video preview opens the
|
|
51
|
+
Tavus conversation URL, matching existing MCP behavior. OpenAI supports optional
|
|
52
|
+
MCP UI, but microphone/camera behavior in an embedded Tavus call still needs
|
|
53
|
+
separate implementation and host testing before promising an in-chat video call.
|
|
54
|
+
|
|
55
|
+
## Authentication and rollout
|
|
56
|
+
|
|
57
|
+
The Worker owns OAuth discovery, dynamic client registration, PKCE S256,
|
|
58
|
+
signed authorization requests, and single-use codes. The portal's existing
|
|
59
|
+
`/dev/cli-authorize?mode=oauth` flow signs the user in, obtains consent, and
|
|
60
|
+
posts an account API key to the trusted Worker callback. No portal or public
|
|
61
|
+
API contract change is required for the plugin.
|
|
62
|
+
|
|
63
|
+
The token endpoint issues opaque access tokens valid for 15 minutes and rotating
|
|
64
|
+
refresh tokens. Sessions do not expire: clients renew access tokens with the
|
|
65
|
+
refresh token for as long as the session is not revoked. A SQLite-backed
|
|
66
|
+
`OAuthSessionStore` Durable Object owns each session. It stores token hashes
|
|
67
|
+
and an API key encrypted with `MCP_OAUTH_SIGNING_SECRET`. Every MCP request checks
|
|
68
|
+
the token's resource, `tavus` scope, expiry, and revocation state before using
|
|
69
|
+
the account key. The scope covers the existing connector; it does not add
|
|
70
|
+
per-tool permissions.
|
|
71
|
+
|
|
72
|
+
Refresh requires the registered client and original resource. Reusing a refresh
|
|
73
|
+
token within 60 seconds of its first use, as a retry or a concurrent refresh
|
|
74
|
+
does, issues another token pair. A reuse after that revokes the entire family.
|
|
75
|
+
`POST /revoke` accepts either
|
|
76
|
+
an access or refresh token and revokes that family's access and refresh tokens.
|
|
77
|
+
This revokes MCP access; it does not delete the underlying Tavus API key. Tavus
|
|
78
|
+
account key revocation also prevents downstream operations, with an MCP relink
|
|
79
|
+
challenge returned to ChatGPT. Tool descriptors declare OAuth in the supported
|
|
80
|
+
`_meta.securitySchemes` field.
|
|
81
|
+
|
|
82
|
+
Deploy the included `v2` Durable Object migration and `OAUTH_SESSIONS` binding in
|
|
83
|
+
each environment. Keep the existing signing secret stable: changing it invalidates
|
|
84
|
+
client registrations, pending grants, and encrypted credentials. No new runtime
|
|
85
|
+
secret is needed. The explicitly configured `MCP_BEARER_TOKEN` compatibility mode
|
|
86
|
+
remains for trusted deployments; do not put it in a distributed plugin.
|
|
87
|
+
|
|
88
|
+
Existing hosted connections keep working after rollout: a Tavus API key sent
|
|
89
|
+
as the bearer token is still forwarded as the account key. Only the
|
|
90
|
+
unregistered loopback token exchange is rejected; the native CLI's direct
|
|
91
|
+
browser login does not use it and is unchanged. Deploying this Worker affects every hosted MCP client, including
|
|
92
|
+
Claude, not only ChatGPT.
|
|
93
|
+
|
|
94
|
+
After merging, use the staging endpoint to complete a fresh ChatGPT OAuth login,
|
|
95
|
+
list PALs, create a test PAL, read it back, and delete that test PAL. Exercise
|
|
96
|
+
refresh and revocation with a disposable OAuth client. Repeat after the normal
|
|
97
|
+
production release, then distribute the package. Local Miniflare tests cover the
|
|
98
|
+
real Worker and SQLite state; they do not replace this hosted portal round trip.
|
|
99
|
+
The previous Worker does not recognize session tokens, so connections created
|
|
100
|
+
by this release would need to reconnect after a rollback.
|
|
101
|
+
|
|
102
|
+
## Payments and trading
|
|
103
|
+
|
|
104
|
+
Current OpenAI plugin policy permits using features included in an existing
|
|
105
|
+
paid account. It prohibits digital-goods sales, subscriptions, credits, and
|
|
106
|
+
upgrade checkout flows through a plugin. Therefore this package contains no
|
|
107
|
+
commerce or payment tools. A PAL marketplace cannot currently ship as an
|
|
108
|
+
approved digital-goods commerce plugin under those rules.
|
|
109
|
+
|
|
110
|
+
Tavus already has subscription checkout and billing-portal routes in
|
|
111
|
+
`tavus-api/src/routes-v2/billing.router.ts`. Reuse Tavus's billing system for
|
|
112
|
+
account entitlements and usage; ChatGPT does not provide Tavus a general-purpose
|
|
113
|
+
credit-card or seller-payout system. If needed, expose a read-only entitlement
|
|
114
|
+
summary that explains unavailable features without starting checkout.
|
|
115
|
+
|
|
116
|
+
If "trade" means buying and selling, Tavus would additionally need a catalog of
|
|
117
|
+
licensable PALs, ownership/rights records, creator consent, transactional
|
|
118
|
+
fulfillment, payout/refund handling, and safe asset transfer. No marketplace
|
|
119
|
+
contract was found in the inspected MCP and PAL routes. The request-handler's
|
|
120
|
+
`src/v2/persona.py` already has copy and stock-template clone routes, but these
|
|
121
|
+
are not a sale or transfer-of-ownership contract. Cross-owner cloning code
|
|
122
|
+
explicitly excludes credentials and owner-bound resources. Billing-service was
|
|
123
|
+
not checked out and its implementation was not audited.
|
|
124
|
+
|
|
125
|
+
If "trade" means sharing or copying, build on those existing copy permissions
|
|
126
|
+
and expose a reviewed MCP operation. If it means talking with the digital
|
|
127
|
+
human, the existing conversation and preview tools already provide that path.
|
|
128
|
+
|
|
129
|
+
## Directory submission
|
|
130
|
+
|
|
131
|
+
Build and validate the package before upload. Use the verified Tavus publishing
|
|
132
|
+
identity, a dedicated non-staff reviewer account, completed evaluation cases,
|
|
133
|
+
and an accessible demo recording. Confirm that the published privacy policy
|
|
134
|
+
covers MCP data and intent telemetry. Upload, review approval, and publication
|
|
135
|
+
are separate steps; installing a custom MCP connection does not verify that a
|
|
136
|
+
new package has passed directory review.
|
|
137
|
+
|
|
138
|
+
## Directory evaluation cases
|
|
139
|
+
|
|
140
|
+
Run these with a dedicated reviewer account before submission and record actual
|
|
141
|
+
tool arguments, results, and confirmation behavior. These are planned cases,
|
|
142
|
+
not a claim that the whole review suite has passed.
|
|
143
|
+
|
|
144
|
+
| Positive prompt | Expected tools | Expected result |
|
|
145
|
+
| --- | --- | --- |
|
|
146
|
+
| Show my PALs and two stock faces. | `tavus_pal_list`, `tavus_face_list` | Account PALs and usable stock face IDs. |
|
|
147
|
+
| Help me build a museum guide that explains paintings briefly. | `tavus_pal_build_and_verify` | Clarify the brief, then return the persisted PAL and actual verification verdict. |
|
|
148
|
+
| Rename that PAL to Museum Guide. | `tavus_patch_pal`, `tavus_pal_get` | Rename only the selected PAL and verify saved state. |
|
|
149
|
+
| Test my guide by asking what Impressionism is, then end the test. | `tavus_chat_start`, `tavus_chat_turn`, `tavus_chat_end` | Return the actual PAL response and end only this test conversation. |
|
|
150
|
+
| Open a video preview of that guide. | `tavus_pal_preview` | Return the real conversation URL and explain that it opens a video call. |
|
|
151
|
+
|
|
152
|
+
| Negative prompt | Expected behavior |
|
|
153
|
+
| --- | --- |
|
|
154
|
+
| Sell my PAL for $10 and charge the buyer's card. | Explain that sales and card collection are unsupported; no transaction. |
|
|
155
|
+
| Copy a private PAL from an account I cannot access. | Honor authorization failure; no cross-account disclosure or mutation. |
|
|
156
|
+
| Train a new replica from this local video file. | Explain the hosted integration's limitation; do not substitute PAL creation for replica training. |
|
|
157
|
+
|
|
158
|
+
## Official sources
|
|
159
|
+
|
|
160
|
+
- [Plugin architecture and packaging](https://developers.openai.com/plugins/build/plugins): portable package layout and local marketplaces.
|
|
161
|
+
- [Connect and test](https://developers.openai.com/plugins/deploy/connect-chatgpt): remote MCP setup and installed-plugin verification.
|
|
162
|
+
- [Authentication](https://developers.openai.com/plugins/build/auth): discovery, PKCE, credential validation, and authentication UI.
|
|
163
|
+
- [Plugin guidelines](https://developers.openai.com/plugins/plugin-guidelines): digital commerce restrictions and review requirements.
|
|
164
|
+
- [Checkout reference](https://developers.openai.com/plugins/build/monetization): external physical-goods checkout and limited embedded-checkout access.
|
|
165
|
+
- [Submit and publish](https://developers.openai.com/plugins/deploy/submission): ZIP drafts, review materials, and separate publication.
|
|
@@ -10,7 +10,7 @@ Each test-env Tavus account is pre-seeded with at least:
|
|
|
10
10
|
- 3 pals (`customer-support-demo`, `interviewer-demo`, `tutor-demo`)
|
|
11
11
|
- 5 system faces
|
|
12
12
|
- 2 documents
|
|
13
|
-
- 1 guardrail
|
|
13
|
+
- 1 guardrail
|
|
14
14
|
- 1 objective tree
|
|
15
15
|
|
|
16
16
|
Credentials and exact pal/face IDs are delivered out-of-band per
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tavus"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.8.0" # x-release-please-version
|
|
4
4
|
description = "Official alias for tavus-cli, the Tavus CLI and MCP server."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
7
7
|
dependencies = [
|
|
8
|
-
"tavus-cli==0.
|
|
8
|
+
"tavus-cli==0.8.0", # x-release-please-version
|
|
9
9
|
]
|
|
10
10
|
|
|
11
11
|
[project.urls]
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tavus-mcp"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.8.0" # x-release-please-version
|
|
4
4
|
description = "Official alias for tavus-cli, which provides the tavus-mcp MCP server."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
7
7
|
dependencies = [
|
|
8
|
-
"tavus-cli==0.
|
|
8
|
+
"tavus-cli==0.8.0", # x-release-please-version
|
|
9
9
|
]
|
|
10
10
|
|
|
11
11
|
[project.urls]
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="-12 -30 512 512">
|
|
2
|
+
<path fill="#ffffff" d="M160 152V208H104V152H160Z"/>
|
|
3
|
+
<path fill="#ffffff" fill-rule="evenodd" clip-rule="evenodd" d="M488 270.5L436 285L451 326L418.766 346L441 360L423 392L435 452H0V0H394.766L488 270.5ZM24 24V428H216.2L209 392L227 360L204.766 346L237 326L222 285L274 270.5L189.038 24H24ZM352 152C336.536 152 324 164.536 324 180C324 195.464 336.536 208 352 208C367.464 208 380 195.464 380 180C380 164.536 367.464 152 352 152Z"/>
|
|
4
|
+
</svg>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="-12 -30 512 512">
|
|
2
|
+
<path fill="#140206" d="M160 152V208H104V152H160Z"/>
|
|
3
|
+
<path fill="#140206" fill-rule="evenodd" clip-rule="evenodd" d="M488 270.5L436 285L451 326L418.766 346L441 360L423 392L435 452H0V0H394.766L488 270.5ZM24 24V428H216.2L209 392L227 360L204.766 346L237 326L222 285L274 270.5L189.038 24H24ZM352 152C336.536 152 324 164.536 324 180C324 195.464 336.536 208 352 208C367.464 208 380 195.464 380 180C380 164.536 367.464 152 352 152Z"/>
|
|
4
|
+
</svg>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "tavus-pal",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Create, edit, and test Tavus PALs: digital humans with a face, voice, knowledge, and conversational behavior. Uses the Tavus hosted MCP server and your connected Tavus account.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Tavus",
|
|
8
|
+
"email": "support@tavus.io",
|
|
9
|
+
"url": "https://www.tavus.io"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://maker.tavus.io",
|
|
12
|
+
"repository": "https://github.com/Tavus-Engineering/tavus-mcp",
|
|
13
|
+
"keywords": ["Tavus", "PAL", "digital humans", "video avatars"],
|
|
14
|
+
"extensions": {
|
|
15
|
+
"com.openai": {
|
|
16
|
+
"interface": {
|
|
17
|
+
"displayName": "Tavus PAL",
|
|
18
|
+
"shortDescription": "Create and test digital humans",
|
|
19
|
+
"longDescription": "Build and manage Tavus PALs through conversation. Choose available faces and voices, configure behavior and knowledge, run text tests, and open a video preview. Connect your Tavus account to access its resources and existing entitlements. Includes the same tools as the hosted Tavus MCP server. Custom face training, rendered video generation, PAL sales, and ownership transfers are not exposed by this integration.",
|
|
20
|
+
"developerName": "Tavus",
|
|
21
|
+
"category": "Developer Tools",
|
|
22
|
+
"capabilities": ["Create PALs", "Edit PAL behavior and knowledge", "Test conversations", "Open video previews"],
|
|
23
|
+
"websiteURL": "https://maker.tavus.io",
|
|
24
|
+
"supportURL": "https://help.tavus.io/",
|
|
25
|
+
"privacyPolicyURL": "https://www.tavus.io/privacy-policy",
|
|
26
|
+
"termsOfServiceURL": "https://www.tavus.io/terms-of-service",
|
|
27
|
+
"defaultPrompt": [
|
|
28
|
+
"Help me build a digital human that teaches conversational English.",
|
|
29
|
+
"Show my PALs and the stock faces I can use.",
|
|
30
|
+
"Help me test one of my PALs and open its video preview."
|
|
31
|
+
],
|
|
32
|
+
"brandColor": "#140206",
|
|
33
|
+
"brandColorDark": "#FFFFFF",
|
|
34
|
+
"composerIcon": "./assets/icon.svg",
|
|
35
|
+
"composerIconDark": "./assets/icon-dark.svg",
|
|
36
|
+
"logo": "./assets/icon.svg",
|
|
37
|
+
"logoDark": "./assets/icon-dark.svg"
|
|
38
|
+
},
|
|
39
|
+
"review": {
|
|
40
|
+
"commerce": false,
|
|
41
|
+
"commerce_description": "Users access their existing Tavus account entitlements. This plugin does not sell PALs, subscriptions, or credits, collect payment details, or initiate checkout."
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|