Not in the top 1,000 by GitHub stars
pattern-ai-labs/agentcall
AgentCall lets AI Agents join meetings with voice, video & screen-share to build together. Supports Google Meet, Teams, Zoom (Beta)
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
6f173169a92f → 6f173169a92f
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 6f173169a92f
No earlier version was observed for comparison.
Verified commit 6f173169a92fa05099c493275705af494a1bb462
git clone --filter=blob:none --no-checkout https://github.com/pattern-ai-labs/agentcall.git .hotskills/pattern-ai-labs-agentcall && git -C .hotskills/pattern-ai-labs-agentcall checkout --detach 6f173169a92fa05099c493275705af494a1bb462
# Copy each selected skill directory from .hotskills/pattern-ai-labs-agentcall into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/pattern-ai-labs/agentcall.git .hotskills/pattern-ai-labs-agentcall && git -C .hotskills/pattern-ai-labs-agentcall checkout --detach 6f173169a92fa05099c493275705af494a1bb462
# Copy each selected skill directory from .hotskills/pattern-ai-labs-agentcall into .gemini/skills/<skill-name>/Heat
6.6- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
join-meeting
When your agent uses it
AgentCall (agentcall.dev) — Join a video meeting (Google Meet, Teams, Zoom) as an AI bot with voice and visual presence. Supports audio-only mode with voice intelligence (barge-in, interruptions), text-to-speech mode, and webpage modes for custom UI. Use when asked to join a call, attend a meeting, or participate in a video conference.
What it loads into context
Frontmatter
126 tokensAlways available to the agent
SKILL.md
25,357 tokensWhen the skill is activated
Reference documents
41,934 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Prerequisites
- Usage
- Options
- Bot Naming
- Modes Explained
- How the Tunnel Works (Webpage Modes)
- Mic Permissions (Webpage Modes)
- Voice Strategies Explained
- Events (stdout)
- Commands (stdin)
- Default Behavior: Active Participation
- Interaction Patterns
- Crash Recovery
- Built-in UI Templates
- Transcript Retrieval
- Safety
- Pricing
- Checking for Skill Updates (optional)
- Examples
- Guides
Scripts executed separately
examples/coding-companion/bridge.pyexamples/elevenlabs-voice/agent.jsexamples/elevenlabs-voice/agent.pyexamples/meeting-assistant-smart/assistant.pyexamples/meeting-assistant-smart/tools.pyexamples/meeting-assistant/assistant.pyexamples/notetaker-multilingual/notetaker.pyexamples/notetaker-simple/notetaker.jsexamples/notetaker-simple/notetaker.pyexamples/notetaker-smart/notetaker.jsexamples/notetaker-smart/notetaker.pyexamples/support-agent/agent.pyscripts/node/agentcall.jsscripts/node/bridge-visual.jsscripts/node/bridge.jsscripts/node/check_update.jsscripts/node/join.jsscripts/node/package.jsonscripts/node/register.jsscripts/node/stdin-commands.jsscripts/node/tunnel.jsscripts/python/agentcall.pyscripts/python/bridge-visual.pyscripts/python/bridge.pyscripts/python/check_update.pyscripts/python/join.pyscripts/python/register.pyscripts/python/tunnel.pyscripts/run.shtests/stdin_commands_node.test.mjstests/test_bridge_stdin.pytests/test_bridge_visual_stdin.pyui-templates/agentcall-audio.js
Files
.claude-plugin/marketplace.jsonasset659 bytes.claude-plugin/plugin.jsonasset1,002 bytes.gitignoreasset77 bytes.grok-plugin/plugin.jsonasset1,030 bytesCHANGELOG.mddoc5,817 bytesLICENSEasset1,083 bytesREADME.mddoc8,425 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesSKILL.mdcore103,274 bytesexamples/coding-companion/README.mddoc11,141 bytesexamples/coding-companion/SKILL-FRAGMENT.mddoc8,097 bytesexamples/coding-companion/bridge.pyruns23,263 bytesexamples/elevenlabs-voice/README.mddoc2,973 bytesexamples/elevenlabs-voice/agent.jsruns9,153 bytesexamples/elevenlabs-voice/agent.pyruns10,042 bytesexamples/meeting-assistant-smart/README.mddoc13,040 bytesexamples/meeting-assistant-smart/assistant.pyruns26,700 bytesexamples/meeting-assistant-smart/tools.pyruns7,689 bytesexamples/meeting-assistant/README.mddoc6,469 bytesexamples/meeting-assistant/assistant.pyruns10,071 bytesexamples/notetaker-multilingual/README.mddoc5,832 bytesexamples/notetaker-multilingual/notetaker.pyruns15,029 bytesexamples/notetaker-simple/README.mddoc2,159 bytesexamples/notetaker-simple/notetaker.jsruns6,737 bytesexamples/notetaker-simple/notetaker.pyruns7,277 bytesexamples/notetaker-smart/README.mddoc4,254 bytesexamples/notetaker-smart/notetaker.jsruns13,485 bytesexamples/notetaker-smart/notetaker.pyruns13,636 bytesexamples/support-agent/README.mddoc6,365 bytesexamples/support-agent/agent.pyruns19,264 bytesexamples/support-agent/knowledge.jsonasset2,092 bytesgemini-extension.jsonasset248 bytesreferences/api.mddoc17,684 bytesreferences/guides/bring-your-own-voice.mddoc3,309 bytesreferences/guides/collaborative-mode.mddoc22,059 bytesreferences/guides/crash-recovery.mddoc8,255 bytesreferences/guides/interruption-handling.mddoc9,559 bytesreferences/guides/ui-templates.mddoc7,282 bytesreferences/guides/webpage-audio.mddoc13,554 bytesreferences/guides/webpage-av-screenshare.mddoc10,045 bytesreferences/guides/webpage-av.mddoc5,788 bytesscripts/node/agentcall.jsruns2,755 bytesscripts/node/bridge-visual.jsruns62,092 bytesscripts/node/bridge.jsruns37,573 bytesscripts/node/check_update.jsruns5,279 bytesscripts/node/join.jsruns6,005 bytesscripts/node/package.jsonruns139 bytesscripts/node/register.jsruns4,925 bytesscripts/node/stdin-commands.jsruns3,318 bytesscripts/node/tunnel.jsruns4,828 bytesscripts/python/agentcall.pyruns5,417 bytesscripts/python/bridge-visual.pyruns90,824 bytesscripts/python/bridge.pyruns57,930 bytesscripts/python/check_update.pyruns4,898 bytesscripts/python/join.pyruns8,710 bytesscripts/python/register.pyruns5,084 bytesscripts/python/requirements.txtdoc30 bytesscripts/python/tunnel.pyruns9,033 bytesscripts/run.shruns1,579 bytestests/stdin_commands_node.test.mjsruns4,783 bytestests/test_bridge_stdin.pyruns3,951 bytestests/test_bridge_visual_stdin.pyruns6,160 bytesui-templates/agentcall-audio.jsruns15,778 bytesui-templates/avatar/index.htmlasset7,904 bytesui-templates/blank/index.htmlasset945 bytesui-templates/dashboard/index.htmlasset3,713 bytesui-templates/orb/index.htmlasset5,519 bytesui-templates/pattern/index.htmlasset14,161 bytesui-templates/ring/index.htmlasset6,786 bytesui-templates/voice-agent/index.htmlasset7,034 bytes
Read SKILL.md
# join-meeting
**IMPORTANT: Read this entire document before joining a meeting.** This file
contains the CALL_LOOP algorithm (mandatory), active participation rules,
safety requirements (leave/cleanup), and mode-specific guidance. Skipping
sections will result in broken meeting experiences — the user will be left
talking to silence.
**IMPORTANT: Read the whole document on every session, not just the parts you
remember.** This skill is updated frequently — new commands, new events, new
recommended patterns (like the event-driven `tail -f` + Monitor flow in
"How to read events") are added often. Do NOT rely on what you remember from
previous sessions. Re-read this document each time you start a meeting so you
pick up the latest guidance. If unsure whether you are on the latest version,View the complete source on GitHubSkills included
- join-meeting
Repository facts
- License
- MIT
- Created
- Apr 12, 2026
- Last pushed
- Oct 24, 2026
- Forks
- 24
- Open issues
- 3
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 14 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 3 dangerous shell commandsin 2 files: examples/meeting-assistant-smart/tools.py:93 SKILL.md:1697
- 571 network referencesin 52 files: SKILL.md:66 scripts/python/bridge-visual.py:23 references/api.md:11 and 49 more
- 6 obfuscation signalsin 5 files: references/guides/webpage-audio.md:208 examples/notetaker-multilingual/notetaker.py:279 scripts/python/bridge-visual.py:911 and 2 more
- No instruction overrides
- 33 executable scriptsin 33 files: examples/coding-companion/bridge.py:1 examples/elevenlabs-voice/agent.js:1 examples/elevenlabs-voice/agent.py:1 and 30 more
- 187 references to secretsin 40 files: examples/notetaker-smart/notetaker.py:9 examples/elevenlabs-voice/agent.py:15 examples/elevenlabs-voice/agent.js:15 and 37 more
- No requests to vote in Hot
Show all 800 signals by file
.claude-plugin/marketplace.json
.claude-plugin/plugin.json
- Network accessline 7
"email": "hi@agentcall.dev" }, "repository": "https://github.com/pattern-ai-labs/agentcall", - Network accessline 8
}, "repository": "https://github.com/pattern-ai-labs/agentcall", "license": "MIT", - Network accessline 9
"repository": "https://github.com/pattern-ai-labs/agentcall", - Network accessline 34
"./SKILL.md" ], "homepage": "https://agentcall.dev" - Network accessline 35
], "homepage": "https://agentcall.dev" } - Network accessline 36
"homepage": "https://agentcall.dev"
.gitignore
- Access to secretsline 9
[Credential-related source omitted]
.grok-plugin/plugin.json
- Network accessline 7
"email": "hi@agentcall.dev" }, "repository": "https://github.com/pattern-ai-labs/agentcall", - Network accessline 8
}, "repository": "https://github.com/pattern-ai-labs/agentcall", "license": "MIT", - Network accessline 9
"repository": "https://github.com/pattern-ai-labs/agentcall", - Network accessline 37
"./SKILL.md" ], "homepage": "https://agentcall.dev" - Network accessline 38
], "homepage": "https://agentcall.dev" } - Network accessline 39
"homepage": "https://agentcall.dev"
CHANGELOG.md
- Network accessline 85
bridge surfaces explicitly instead of failing as a silent no-op. Existing `{"command": ...}` inputs are unchanged. Thanks to [@keithballinger](https://github.com/keithballinger) (#2, with #7–#9). - Network accessline 87
[@keithballinger](https://github.com/keithballinger) (#2, with #7–#9).
README.md
- Network accessline 5
An [AgentCall](https://agentcall.dev) skill that enables AI coding agents (Claude Code, Cursor, Codex, Gemini CLI, OpenClaw, Windsurf, Junie, and 30+ more) to join Google Meet, Zoom, and Microsoft Teams as a bot with voice conversation, vis - Network accessline 38
4. **An AgentCall account** — free, and the agent can create it for you. On first run with no key, the skill registers you via a one-time email code (or paste an existing key from https://app.agentcall.dev/api-keys). New accounts incl - Network accessline 39
run with no key, the skill registers you via a one-time email code (or paste an existing key from https://app.agentcall.dev/api-keys). New accounts include free trial credits. - Network accessline 40
existing key from https://app.agentcall.dev/api-keys). New accounts include free - Network accessline 54
[](https://www.youtube.com/watch?v=mrwzHWnJMCw) - Network accessline 73
gemini extensions install https://github.com/pattern-ai-labs/agentcall - Network accessline 81
git clone https://github.com/pattern-ai-labs/agentcall.git - Network accessline 91
[](https://www.youtube.com/watch?v=qpgjhRvzP_Q) - Network accessline 95
[](https://www.youtube.com/watch?v=d4DD8HP65pU) - Network accessline 99
Tell your agent: *"Join this meeting: https://meet.google.com/abc-def-ghi"* - Network accessline 149
| Endpoint | Used by | Purpose | |---|---|---| | `https://api.agentcall.dev` | `scripts/*/agentcall.*`, `join.*`, bridges | Create and end calls, read call state and transcripts | - Network accessline 150
|---|---|---| | `https://api.agentcall.dev` | `scripts/*/agentcall.*`, `join.*`, bridges | Create and end calls, read call state and transcripts | | `wss://api.agentcall.dev/v1/calls/{id}/ws` | bridges | Live meeting events in; agent comman - Network accessline 151
| `https://api.agentcall.dev` | `scripts/*/agentcall.*`, `join.*`, bridges | Create and end calls, read call state and transcripts | - Network accessline 152
| `wss://api.agentcall.dev/v1/calls/{id}/ws` | bridges | Live meeting events in; agent commands (speak, chat, screenshare) out | | `wss://api.agentcall.dev/internal/tunnel/connect` | `tunnel.*` (webpage modes only) | Outbound tunnel that le - Network accessline 153
| `wss://api.agentcall.dev/internal/tunnel/connect` | `tunnel.*` (webpage modes only) | Outbound tunnel that lets the meeting bot load your local UI page, which is served on `127.0.0.1` only. No inbound port is opened on your machine | | `h - Network accessline 154
| `https://api.agentcall.dev/v1/auth/email-otp/*` | `register.*` (optional) | One-time email code to create an account and mint an API key | - Network accessline 155
| `https://raw.githubusercontent.com/pattern-ai-labs/agentcall/main/.claude-plugin/plugin.json` | `check_update.*` (optional) | Reads the published version string to tell you an update exists. Cached for 7 days; sends no data | - Network accessline 157
`https://app.agentcall.dev` appears only as a link for you to create or manage keys — the scripts never call it. The API base can be overridden with the `AGENTCALL_API_URL` environment variable (or `api_url` in the config file). - Access to secretsline 159
[Credential-related source omitted] - Network accessline 165
**Meeting data:** the bot is a visible, named participant. Meeting audio and transcripts stream through `api.agentcall.dev` in real time and are not permanently stored — see the [Privacy Policy](https://agentcall.dev/privacy). - Network accessline 175
Base plan: 6 hours of meeting time, 1 concurrent call. All features included. Paid: per-minute billing. See [agentcall.dev](https://agentcall.dev) for details. - Network accessline 176
Paid: per-minute billing. See [agentcall.dev](https://agentcall.dev) for details. - Network accessline 184
Built by [AgentCall](https://agentcall.dev) (Pattern AI Labs)
SKILL.md
- Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Network accessline 66
**Option B — Use an existing key.** Ask the user for their API key (create one at https://app.agentcall.dev/api-keys), then save it: - Network accessline 67
(create one at https://app.agentcall.dev/api-keys), then save it: - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Network accessline 108
Offer to explain any option if the user wants clarification. Mention they can see real-world examples at https://www.youtube.com/@pattern-ai-labs. - Network accessline 109
see real-world examples at https://www.youtube.com/@pattern-ai-labs. - Access to secretsline 115
[Credential-related source omitted] - Network accessline 152
| `--webpage-url` | | Public URL for webpage modes (no tunnel needed) | | `--screenshare-url` | | Public URL for screenshare content (no tunnel needed) | | `--max-duration` | plan limit | Max call duration in minutes. Cannot exceed your pla - Network accessline 153
| `--screenshare-url` | | Public URL for screenshare content (no tunnel needed) | | `--max-duration` | plan limit | Max call duration in minutes. Cannot exceed your plan's limit. Check https://agentcall.dev for current limits. | | `--alone- - Network accessline 154
| `--max-duration` | plan limit | Max call duration in minutes. Cannot exceed your plan's limit. Check https://agentcall.dev for current limits. | - Network accessline 155
| `--alone-timeout` | 120 | Leave if alone for N seconds. | | `--silence-timeout` | 300 | Leave if silent for N seconds. | | `--api-url` | `https://api.agentcall.dev` | Override API URL for development | - Network accessline 157
| `--api-url` | `https://api.agentcall.dev` | Override API URL for development | - Network accessline 189
If your webpage is publicly hosted, pass `--webpage-url https://your-site.com/bot` - Network accessline 226
Agent controls screenshare dynamically during the call: - `screenshare.start` with `url` — share a public URL: `{"command": "screenshare.start", "url": "https://slides.google.com/..."}` - Network accessline 227
- `screenshare.start` with `url` — share a public URL: `{"command": "screenshare.start", "url": "https://slides.google.com/..."}` - Network accessline 228
- `screenshare.start` with `port` — share a local server via tunnel: `{"command": "screenshare.start", "port": 3001}` - `screenshare.stop` — stop sharing: `{"command": "screenshare.stop"}` - `screenshare.swap` — atomically swap to a differe - Network accessline 230
- `screenshare.swap` — atomically swap to a different page: `{"command": "screenshare.swap", "port": 3002}` or `{"command": "screenshare.swap", "url": "https://..."}`. Use this instead of stop+start when changing what's shared during a call - Network accessline 322
**What the tunnel carries:** any content in both directions — HTML/JS/CSS, images, fonts, compressed responses, and POST/PUT bodies (binary included). **Use relative paths** in your page (`img/logo.png`, `fetch('data.json')`), not absolute - Network accessline 615
extra call during this 5-minute grace window so the rejoin works even on the base plan. If the user is on the base plan (1hr max), mention that Pro offers 4hr max duration — upgrade at https://app.agentcall.dev/add-credits ($29/mo subscript - Network accessline 617
upgrade at https://app.agentcall.dev/add-credits ($29/mo subscription or recharge $50+ for 30 days of Pro). - Network accessline 620
`balance_microcents` (raw balance) and `estimated_minutes_remaining` (calculated from current call's mode and add-on rates). The agent should inform the user and suggest recharging at https://app.agentcall.dev/add-credits. **Credits low doe - Network accessline 621
call's mode and add-on rates). The agent should inform the user and suggest recharging at https://app.agentcall.dev/add-credits. **Credits low does NOT terminate the call** — the call continues and credits can go negative. This is a courtes - Network accessline 622
https://app.agentcall.dev/add-credits. **Credits low does NOT terminate the call** — the call - Network accessline 686
{"type": "capture.frame", "data": "base64-jpeg...", "frame_number": 5} {"type": "capture.stopped", "total_frames": 30} {"type": "screenshare.started", "url": "https://..."} - Network accessline 687
{"type": "capture.stopped", "total_frames": 30} {"type": "screenshare.started", "url": "https://..."} {"type": "screenshare.stopped"} - Network accessline 688
{"type": "screenshare.started", "url": "https://..."} - Network accessline 827
{"type": "capture.start", "interval_ms": 1000} {"type": "capture.stop"} {"type": "screenshare.start", "url": "https://your-slides.com"} - Network accessline 828
{"type": "capture.stop"} {"type": "screenshare.start", "url": "https://your-slides.com"} {"type": "screenshare.start", "port": 3001} - Network accessline 829
{"type": "screenshare.start", "url": "https://your-slides.com"} - Network accessline 830
{"type": "screenshare.start", "port": 3001} {"type": "screenshare.swap", "url": "https://different-page.com"} {"type": "screenshare.swap", "port": 3002} - Network accessline 831
{"type": "screenshare.swap", "url": "https://different-page.com"} - Network accessline 974
python scripts/python/bridge.py "https://meet.google.com/abc" --name "Claude" --voice af_heart - Network accessline 979
# Built-in avatar (no local server needed) python scripts/python/bridge-visual.py "https://meet.google.com/abc" --name "Claude" - Network accessline 980
python scripts/python/bridge-visual.py "https://meet.google.com/abc" --name "Claude" - Network accessline 982
# With local screenshare (agent runs local server on port 3001) python scripts/python/bridge-visual.py "https://meet.google.com/abc" --screenshare-port 3001 - Network accessline 983
python scripts/python/bridge-visual.py "https://meet.google.com/abc" --screenshare-port 3001 - Network accessline 985
# With public URLs for both avatar and screenshare python scripts/python/bridge-visual.py "https://meet.google.com/abc" \ - Network accessline 986
python scripts/python/bridge-visual.py "https://meet.google.com/abc" \ - Network accessline 987
--webpage-url "https://your-site.com/avatar" \ - Network accessline 988
--screenshare-url "https://your-site.com/slides" - Network accessline 994
python scripts/python/bridge-visual.py "https://meet.google.com/abc" --name "Juno" \ - Network accessline 1024
bridge-visual.py extends bridge.py with: - Bot has an animated avatar visible to participants (7 voice states) - Agent can screenshare public URLs: `{"command": "screenshare.start", "url": "https://..."}` - Network accessline 1025
- Bot has an animated avatar visible to participants (7 voice states) - Agent can screenshare public URLs: `{"command": "screenshare.start", "url": "https://..."}` - Agent can screenshare local ports: `{"command": "screenshare.start", "port - Network accessline 1026
- Agent can screenshare public URLs: `{"command": "screenshare.start", "url": "https://..."}` - Network accessline 1044
3. User: "Can you show me the data?" Agent: {"command": "tts.speak", "text": "Sure, let me share my screen."} Agent: {"command": "screenshare.start", "url": "https://my-dashboard.com/slides"} - Network accessline 1045
Agent: {"command": "tts.speak", "text": "Sure, let me share my screen."} Agent: {"command": "screenshare.start", "url": "https://my-dashboard.com/slides"} → Receives: {"event": "screenshare.started", "url": "..."} - Network accessline 1046
Agent: {"command": "screenshare.start", "url": "https://my-dashboard.com/slides"} - Network accessline 1099
{"event": "webpage.opened", "url": "https://xyz.conn.agentcall.dev/k/{accessKey}/webpage/"} - Network accessline 1109
2. Agent opens the webpage tunnel: {"command": "webpage.open", "port": 3002} → Receives: {"event": "webpage.opened", "url": "https://xyz.conn.agentcall.dev/k/.../webpage/"} - Network accessline 1111
→ Receives: {"event": "webpage.opened", "url": "https://xyz.conn.agentcall.dev/k/.../webpage/"} - Network accessline 1113
3. Agent shares the URL in meeting chat: {"command": "send_chat", "message": "Here's the report: https://xyz.conn.agentcall.dev/k/.../webpage/"} - Network accessline 1114
{"command": "send_chat", "message": "Here's the report: https://xyz.conn.agentcall.dev/k/.../webpage/"} - Network accessline 1231
- **Before `screenshare.start` (local port):** run `curl http://localhost:PORT/` and verify the response body is the HTML you expect. - Network accessline 1232
- **After the `screenshare.started` event arrives:** the event includes the tunnel `url`. Run `curl <url>` to confirm it returns 200 end-to-end through the tunnel. If this fails, the local content is fine but the tunnel side is broken. **Re - Network accessline 1319
{"command": "tts.speak", "text": "Hello! I'm here.", "voice": "af_heart"} {"command": "tts.speak", "text": "The health endpoint returned OK.", "voice": "af_heart", "speed": 1.0} {"command": "send_chat", "message": "https://github.com/org/re - Network accessline 1320
{"command": "tts.speak", "text": "The health endpoint returned OK.", "voice": "af_heart", "speed": 1.0} {"command": "send_chat", "message": "https://github.com/org/repo/pull/42"} {"command": "raise_hand"} - Network accessline 1321
{"command": "send_chat", "message": "https://github.com/org/repo/pull/42"} - Network accessline 1367
[Credential-related source omitted] - Network accessline 1368
[Credential-related source omitted] - Access to secretsline 1368
[Credential-related source omitted] - Network accessline 1369
"https://api.agentcall.dev/v1/calls/$CALL_ID" | jq -r .status) - Network accessline 1371
[Credential-related source omitted] - Network accessline 1372
[Credential-related source omitted] - Access to secretsline 1372
[Credential-related source omitted] - Network accessline 1373
"https://api.agentcall.dev/v1/calls/$CALL_ID" \ - Network accessline 1376
[Credential-related source omitted] - Network accessline 1377
[Credential-related source omitted] - Access to secretsline 1377
[Credential-related source omitted] - Network accessline 1378
"https://api.agentcall.dev/v1/calls/$CALL_ID" - Network accessline 1434
Agent speaks: "I found the issue. I'll put the fix in chat." Agent sends: {"command": "send_chat", "message": "https://github.com/org/repo/pull/42"} - Network accessline 1435
Agent sends: {"command": "send_chat", "message": "https://github.com/org/repo/pull/42"} - Network accessline 1487
| Agent | How to spawn bridge.py | |-------|----------------------| | Claude Code / Agent SDK | `bash("python scripts/python/bridge.py 'https://meet.google.com/abc' --name Claude")` | - Network accessline 1488
|-------|----------------------| | Claude Code / Agent SDK | `bash("python scripts/python/bridge.py 'https://meet.google.com/abc' --name Claude")` | | OpenAI Codex | `!python scripts/python/bridge.py "https://meet.google.com/abc" --name Cod - Network accessline 1489
| Claude Code / Agent SDK | `bash("python scripts/python/bridge.py 'https://meet.google.com/abc' --name Claude")` | - Network accessline 1490
| OpenAI Codex | `!python scripts/python/bridge.py "https://meet.google.com/abc" --name Codex` | - Network accessline 1586
- **Git Bash** (ships with [Git for Windows](https://git-scm.com/download/win)): all commands above work as-is. - Network accessline 1670
# Start bridge in background with file output python scripts/python/bridge.py "https://meet.google.com/abc" --name Agent \ - Network accessline 1671
python scripts/python/bridge.py "https://meet.google.com/abc" --name Agent \ - Network accessline 1684
# Create named pipe and start bridge reading from it mkfifo /tmp/meeting-stdin python scripts/python/bridge.py "https://meet.google.com/abc" --name Agent \ - Network accessline 1685
mkfifo /tmp/meeting-stdin python scripts/python/bridge.py "https://meet.google.com/abc" --name Agent \ --output /tmp/meeting-events.jsonl < /tmp/meeting-stdin 2>/tmp/meeting.err & - Network accessline 1686
python scripts/python/bridge.py "https://meet.google.com/abc" --name Agent \ - Dangerous shell operationline 1697
rm /tmp/meeting-stdin - Network accessline 1866
curl https://api.agentcall.dev/v1/calls/{call_id}/transcript?format=json \ - Network accessline 1876
| Auto-leave when alone | 2 minutes | | Silence timeout | 5 minutes | | Max duration | Plan limit (check https://agentcall.dev for current limits) | - Network accessline 1877
| Silence timeout | 5 minutes | | Max duration | Plan limit (check https://agentcall.dev for current limits) | | Transcription | On (required for agent to receive speech as text) | - Network accessline 1878
| Max duration | Plan limit (check https://agentcall.dev for current limits) | - Network accessline 1891
Paid: per-minute billing. Base rate varies by mode (audio cheapest, screenshare most expensive). Add-ons: transcription, voice intelligence, TTS. Check https://agentcall.dev for current rates and plan limits. - Network accessline 1893
Check https://agentcall.dev for current rates and plan limits. - Network accessline 1917
"latest_version": "1.1.0", "update_available": true, "repo_url": "https://github.com/pattern-ai-labs/agentcall", - Network accessline 1918
"update_available": true, "repo_url": "https://github.com/pattern-ai-labs/agentcall", "update_commands": { - Network accessline 1919
"repo_url": "https://github.com/pattern-ai-labs/agentcall", - Network accessline 1921
"marketplace": "/plugin marketplace update pattern-ai-labs-agentcall && /plugin update join-meeting", "git": "git pull", "zip": "Download the latest release from https://github.com/pattern-ai-labs/agentcall" - Network accessline 1922
"git": "git pull", "zip": "Download the latest release from https://github.com/pattern-ai-labs/agentcall" }, - Network accessline 1923
"zip": "Download the latest release from https://github.com/pattern-ai-labs/agentcall"
examples/coding-companion/README.md
- Network accessline 22
You (typing): "check if the health endpoint is responding" Agent: runs curl https://api.agentcall.dev/health - Network accessline 23
Agent: runs curl https://api.agentcall.dev/health - Network accessline 30
You (typing): "join this meeting: https://meet.google.com/abc-def-ghi" - Access to secretsline 123
[Credential-related source omitted] - Network accessline 148
# In one terminal, run the bridge: python bridge.py "https://meet.google.com/abc-def-ghi" --name "Claude" - Network accessline 149
python bridge.py "https://meet.google.com/abc-def-ghi" --name "Claude" - Network accessline 154
# Or pipe commands: echo '{"command": "tts.speak", "text": "Hello!"}' | python bridge.py "https://meet.google.com/abc" - Network accessline 155
echo '{"command": "tts.speak", "text": "Hello!"}' | python bridge.py "https://meet.google.com/abc" - Network accessline 191
# Default: 2 seconds (good for most speakers) python bridge.py "https://meet.google.com/abc" - Network accessline 192
python bridge.py "https://meet.google.com/abc" - Network accessline 194
# Slow speakers or complex instructions: increase to 3-4s python bridge.py "https://meet.google.com/abc" --vad-timeout 3.5 - Network accessline 195
python bridge.py "https://meet.google.com/abc" --vad-timeout 3.5 - Network accessline 197
# Fast back-and-forth conversation: decrease to 1-1.5s python bridge.py "https://meet.google.com/abc" --vad-timeout 1.0 - Network accessline 198
python bridge.py "https://meet.google.com/abc" --vad-timeout 1.0 - Network accessline 205
Some information is hard to speak aloud: - URLs: "https://api.agentcall.dev/v1/payments/webhook" sounds terrible via TTS - Network accessline 206
- URLs: "https://api.agentcall.dev/v1/payments/webhook" sounds terrible via TTS - Network accessline 225
{"command": "send_chat", "message": "Here's the deployment URL: https://agentcall.dev"}
examples/coding-companion/SKILL-FRAGMENT.md
- Network accessline 30
# Spawn the bridge as a subprocess (bridge.py is in scripts/python/) python scripts/python/bridge.py "https://meet.google.com/abc-def-ghi" --name "Claude" --voice af_heart - Network accessline 31
python scripts/python/bridge.py "https://meet.google.com/abc-def-ghi" --name "Claude" --voice af_heart - Network accessline 35
The key is read from `~/.agentcall/config.json` (persists across sessions) or `AGENTCALL_API_KEY` env var. If neither exists, ask the user for their key (get one at https://app.agentcall.dev/api-keys) and save it: - Access to secretsline 36
[Credential-related source omitted] - Network accessline 37
(get one at https://app.agentcall.dev/api-keys) and save it: - Access to secretsline 39
[Credential-related source omitted] - Network accessline 83
(You run: curl https://api.agentcall.dev/health → {"status":"ok"}) - Network accessline 90
→ stdin: {"command": "send_chat", "message": "https://agentcall.dev"}
examples/coding-companion/bridge.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 38
stdin commands (agent → bridge): {"command": "tts.speak", "text": "Health check returned OK", "voice": "af_heart"} {"command": "send_chat", "message": "Here's the URL: https://..."} - Network accessline 39
{"command": "tts.speak", "text": "Health check returned OK", "voice": "af_heart"} {"command": "send_chat", "message": "Here's the URL: https://..."} {"command": "raise_hand"} - Network accessline 40
{"command": "send_chat", "message": "Here's the URL: https://..."} - Network accessline 44
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Network accessline 46
python bridge.py "https://meet.google.com/abc-def-ghi" - Network accessline 48
# Custom bot name, voice, and VAD timeout python bridge.py "https://meet.google.com/abc" --name "Claude" --voice af_bella --vad-timeout 3.0 - Network accessline 49
python bridge.py "https://meet.google.com/abc" --name "Claude" --voice af_bella --vad-timeout 3.0 - Network accessline 99
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 103
[Credential-related source omitted] - Network accessline 198
async def _get_session(self) -> aiohttp.ClientSession: if self.session is None or self.session.closed: self.session = aiohttp.ClientSession( - Network accessline 199
[Credential-related source omitted] - Network accessline 200
self.session = aiohttp.ClientSession( - Access to secretsline 201
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted]
examples/elevenlabs-voice/README.md
- Network accessline 24
You need an AgentCall API key and an [ElevenLabs](https://elevenlabs.io) API key. - Network accessline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 32
python agent.py "https://meet.google.com/abc-def-ghi" - Network accessline 39
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Network accessline 41
node agent.js "https://meet.google.com/abc-def-ghi"
examples/elevenlabs-voice/agent.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Network accessline 16
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Network accessline 17
* node agent.js "https://meet.google.com/abc-def-ghi" - Network accessline 18
* * # Custom bot name and ElevenLabs voice * node agent.js "https://meet.google.com/abc" --name "Ava" --voice-id 21m00Tcm4TlvDq8ikWAM - Network accessline 19
* # Custom bot name and ElevenLabs voice * node agent.js "https://meet.google.com/abc" --name "Ava" --voice-id 21m00Tcm4TlvDq8ikWAM * - Network accessline 20
* node agent.js "https://meet.google.com/abc" --name "Ava" --voice-id 21m00Tcm4TlvDq8ikWAM - Network accessline 48
const API_BASE = process.env.AGENTCALL_API_URL || _cfg.api_url || "https://api.agentcall.dev"; - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Network accessline 137
async _speak(text, signal) { console.log(` [bot] ${text}`); const url = `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}/stream?output_format=pcm_${SAMPLE_RATE}`; - Network accessline 138
console.log(` [bot] ${text}`); const url = `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}/stream?output_format=pcm_${SAMPLE_RATE}`; const resp = await fetch(url, { - Network accessline 139
const url = `https://api.elevenlabs.io/v1/text-to-speech/${voiceId}/stream?output_format=pcm_${SAMPLE_RATE}`; const resp = await fetch(url, { method: "POST", - Network accessline 140
const resp = await fetch(url, { - Access to secretsline 142
[Credential-related source omitted] - Network accessline 181
[Credential-related source omitted] - Network accessline 182
[Credential-related source omitted] - Access to secretsline 182
[Credential-related source omitted] - Network accessline 183
const resp = await fetch(`${API_BASE}/v1/calls`, { - Network accessline 201
const endCall = () => fetch(`${API_BASE}/v1/calls/${call.call_id}`, { method: "DELETE", headers }).catch(() => {}); - Access to secretsline 208
[Credential-related source omitted]
examples/elevenlabs-voice/agent.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 15
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Network accessline 17
python agent.py "https://meet.google.com/abc-def-ghi" - Network accessline 19
# Custom bot name and ElevenLabs voice python agent.py "https://meet.google.com/abc" --name "Ava" --voice-id 21m00Tcm4TlvDq8ikWAM - Network accessline 20
python agent.py "https://meet.google.com/abc" --name "Ava" --voice-id 21m00Tcm4TlvDq8ikWAM - Network accessline 56
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Network accessline 129
async def _speak(self, text: str): url = (f"https://api.elevenlabs.io/v1/text-to-speech/{self.voice_id}/stream" - Network accessline 130
url = (f"https://api.elevenlabs.io/v1/text-to-speech/{self.voice_id}/stream" - Access to secretsline 133
[Credential-related source omitted] - Network accessline 168
[Credential-related source omitted] - Network accessline 169
[Credential-related source omitted] - Access to secretsline 169
[Credential-related source omitted] - Network accessline 170
async with aiohttp.ClientSession() as http: - Access to secretsline 185
[Credential-related source omitted]
examples/meeting-assistant-smart/README.md
- Access to secretsline 145
[Credential-related source omitted] - Access to secretsline 146
[Credential-related source omitted] - Network accessline 148
python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 154
# Default: Juno with database, docs, calculate, tickets python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 155
python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 157
# Custom name and triggers python assistant.py "https://meet.google.com/abc" --name "Aria" --triggers "aria,hey aria" - Network accessline 158
python assistant.py "https://meet.google.com/abc" --name "Aria" --triggers "aria,hey aria" - Network accessline 160
# Custom voice python assistant.py "https://meet.google.com/abc" --voice voice.bella - Network accessline 161
python assistant.py "https://meet.google.com/abc" --voice voice.bella
examples/meeting-assistant-smart/assistant.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 27
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Network accessline 29
python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 56
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 175
[Credential-related source omitted] - Access to secretsline 191
[Credential-related source omitted] - Access to secretsline 209
[Credential-related source omitted] - Network accessline 302
def create_call(meet_url: str, bot_name: str, trigger_words: List[str], context: str, voice: str) -> dict: resp = requests.post( - Network accessline 303
resp = requests.post( - Network accessline 509
print("Ending call...") try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 510
try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 511
requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 523
epilog=""" Examples: python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 524
Examples: python assistant.py "https://meet.google.com/abc-def-ghi" python assistant.py "https://meet.google.com/abc" --name "Aria" --triggers "aria,hey aria" - Network accessline 525
python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 526
python assistant.py "https://meet.google.com/abc" --name "Aria" --triggers "aria,hey aria" - Network accessline 527
python assistant.py "https://meet.google.com/abc" --voice voice.bella - Network accessline 567
except KeyboardInterrupt: print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) - Network accessline 568
print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 569
requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS)
examples/meeting-assistant-smart/tools.py
- Executable scriptline 1
Executable file - Network accessline 32
Replace this with your actual database: - SQL: await db.execute("SELECT ... WHERE ...") - REST API: await httpx.get(f"{api}/data?q={query}") - Network accessline 33
- SQL: await db.execute("SELECT ... WHERE ...") - REST API: await httpx.get(f"{api}/data?q={query}") - GraphQL: await client.execute(query) - Network accessline 34
- REST API: await httpx.get(f"{api}/data?q={query}") - Network accessline 47
# # import httpx # async with httpx.AsyncClient() as client: - Network accessline 48
# import httpx # async with httpx.AsyncClient() as client: # resp = await client.get(f"https://api.yourcompany.com/data", params={"q": query}) - Network accessline 49
# async with httpx.AsyncClient() as client: - Network accessline 50
# resp = await client.get(f"https://api.yourcompany.com/data", params={"q": query}) - Dangerous shell operationline 93
- Simple math: eval() with safety checks - Dangerous shell operationline 109
# result = eval(compile(ast.parse(expression, mode='eval'), '', 'eval'))
examples/meeting-assistant/README.md
- Network accessline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 34
python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 40
# Default: "Juno" responds to "juno", "zuno", "assistant" python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 41
python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 43
# Custom name and trigger words python assistant.py "https://meet.google.com/abc" --name "Aria" --triggers "aria,hey aria" - Network accessline 44
python assistant.py "https://meet.google.com/abc" --name "Aria" --triggers "aria,hey aria" - Network accessline 46
# Custom voice (GetSun voices: voice.heart, voice.bella, voice.echo, voice.eric) python assistant.py "https://meet.google.com/abc" --voice voice.bella - Network accessline 47
python assistant.py "https://meet.google.com/abc" --voice voice.bella - Network accessline 49
# Custom persona python assistant.py "https://meet.google.com/abc" --context "You are a financial analyst. Answer with data and numbers." - Network accessline 50
python assistant.py "https://meet.google.com/abc" --context "You are a financial analyst. Answer with data and numbers." - Network accessline 52
# Custom output file python assistant.py "https://meet.google.com/abc" --output standup-log.md - Network accessline 53
python assistant.py "https://meet.google.com/abc" --output standup-log.md
examples/meeting-assistant/assistant.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 14
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Network accessline 16
python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 18
# Custom bot name and trigger words python assistant.py "https://meet.google.com/abc" --name "Juno" --triggers "juno,zuno,assistant" - Network accessline 19
python assistant.py "https://meet.google.com/abc" --name "Juno" --triggers "juno,zuno,assistant" - Network accessline 44
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Network accessline 56
resp = requests.post( - Network accessline 198
print("Ending call...") try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 199
try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 200
requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 216
python assistant.py "https://meet.google.com/abc-def-ghi" - Network accessline 219
python assistant.py "https://meet.google.com/abc" --name "Aria" --triggers "aria,hey aria" - Network accessline 222
python assistant.py "https://meet.google.com/abc" --voice voice.bella - Network accessline 254
except KeyboardInterrupt: print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) - Network accessline 255
print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 256
requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS)
examples/notetaker-multilingual/README.md
- Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Network accessline 36
# Basic — audio only, cheapest (only base rate charged) python notetaker.py "https://meet.google.com/abc-def-ghi" - Network accessline 37
python notetaker.py "https://meet.google.com/abc-def-ghi" - Network accessline 39
# With English STT for better speaker identification # (adds STT billing but Gemini can match speaker names to voices) python notetaker.py "https://meet.google.com/abc" --with-english-stt - Network accessline 41
python notetaker.py "https://meet.google.com/abc" --with-english-stt - Network accessline 43
# Save the raw audio file for records python notetaker.py "https://meet.google.com/abc" --save-audio - Network accessline 44
python notetaker.py "https://meet.google.com/abc" --save-audio - Network accessline 46
# Custom bot name and output python notetaker.py "https://meet.google.com/abc" --name "Translator" --output standup.md - Network accessline 47
python notetaker.py "https://meet.google.com/abc" --name "Translator" --output standup.md - Network accessline 49
# All options python notetaker.py "https://meet.google.com/abc" --name "Scribe" --save-audio --with-english-stt --output weekly.md - Network accessline 50
python notetaker.py "https://meet.google.com/abc" --name "Scribe" --save-audio --with-english-stt --output weekly.md
examples/notetaker-multilingual/notetaker.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 14
[Credential-related source omitted] - Access to secretsline 14
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Network accessline 16
python notetaker.py "https://meet.google.com/abc-def-ghi" - Network accessline 18
# Save raw audio file for archival python notetaker.py "https://meet.google.com/abc" --save-audio - Network accessline 19
python notetaker.py "https://meet.google.com/abc" --save-audio - Network accessline 21
# Custom output file python notetaker.py "https://meet.google.com/abc" --output standup.md - Network accessline 22
python notetaker.py "https://meet.google.com/abc" --output standup.md - Network accessline 58
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 181
[Credential-related source omitted] - Network accessline 198
resp = requests.post( - Possible obfuscationline 279
pcm_bytes = base64.b64decode(audio_b64) - Network accessline 302
print("Ending call...") try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 303
try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 304
requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 351
python notetaker.py "https://meet.google.com/abc-def-ghi" - Network accessline 354
python notetaker.py "https://meet.google.com/abc" --save-audio - Network accessline 357
python notetaker.py "https://meet.google.com/abc" --with-english-stt - Network accessline 360
python notetaker.py "https://meet.google.com/abc" --name "Translator" --output standup.md - Network accessline 386
except KeyboardInterrupt: print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) - Network accessline 387
print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 388
requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS)
examples/notetaker-simple/README.md
- Network accessline 24
[Credential-related source omitted] - Access to secretsline 25
[Credential-related source omitted] - Network accessline 26
python notetaker.py "https://meet.google.com/abc-def-ghi" - Network accessline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 34
node notetaker.js "https://meet.google.com/abc-def-ghi" - Network accessline 40
# Custom bot name (default: "Notetaker") python notetaker.py "https://meet.google.com/abc-def-ghi" --name "Scribe" - Network accessline 41
python notetaker.py "https://meet.google.com/abc-def-ghi" --name "Scribe" - Network accessline 42
node notetaker.js "https://meet.google.com/abc-def-ghi" --name "Scribe"
examples/notetaker-simple/notetaker.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 8
[Credential-related source omitted] - Network accessline 9
[Credential-related source omitted] - Access to secretsline 9
[Credential-related source omitted] - Network accessline 10
* node notetaker.js "https://meet.google.com/abc-def-ghi" - Network accessline 11
* * # Optional: customize bot name * node notetaker.js "https://meet.google.com/abc-def-ghi" --name "Scribe" - Network accessline 12
* # Optional: customize bot name * node notetaker.js "https://meet.google.com/abc-def-ghi" --name "Scribe" * - Network accessline 13
* node notetaker.js "https://meet.google.com/abc-def-ghi" --name "Scribe" - Network accessline 29
const API_BASE = process.env.AGENTCALL_API_URL || _cfg.api_url || "https://api.agentcall.dev"; - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Network accessline 53
async function createCall(meetUrl, botName) { const resp = await fetch(`${API_BASE}/v1/calls`, { - Network accessline 54
const resp = await fetch(`${API_BASE}/v1/calls`, { - Network accessline 72
async function fetchTranscript(callId) { const resp = await fetch( - Network accessline 73
const resp = await fetch( - Network accessline 209
async function cleanup(callId) { try { await fetch(`${API_BASE}/calls/${callId}`, { method: "DELETE", headers: HEADERS }); - Network accessline 210
try { await fetch(`${API_BASE}/calls/${callId}`, { method: "DELETE", headers: HEADERS }); console.log("Call ended (cleanup)"); - Network accessline 211
await fetch(`${API_BASE}/calls/${callId}`, { method: "DELETE", headers: HEADERS });
examples/notetaker-simple/notetaker.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 8
[Credential-related source omitted] - Access to secretsline 9
[Credential-related source omitted] - Network accessline 10
python notetaker.py "https://meet.google.com/abc-def-ghi" - Network accessline 12
# Optional: customize bot name python notetaker.py "https://meet.google.com/abc-def-ghi" --name "Scribe" - Network accessline 13
python notetaker.py "https://meet.google.com/abc-def-ghi" --name "Scribe" - Network accessline 35
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Network accessline 47
resp = requests.post( - Network accessline 64
resp = requests.get( - Network accessline 157
print("Ending call...") try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 158
try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 159
requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 205
except KeyboardInterrupt: print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) - Network accessline 206
print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 207
requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS)
examples/notetaker-smart/README.md
- Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Network accessline 37
python notetaker.py "https://meet.google.com/abc-def-ghi" - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Network accessline 49
node notetaker.js "https://meet.google.com/abc-def-ghi" - Network accessline 55
# Custom bot name python notetaker.py "https://meet.google.com/abc" --name "Scribe" - Network accessline 56
python notetaker.py "https://meet.google.com/abc" --name "Scribe" - Network accessline 58
# Custom output file python notetaker.py "https://meet.google.com/abc" --output weekly-standup.md - Network accessline 59
python notetaker.py "https://meet.google.com/abc" --output weekly-standup.md
examples/notetaker-smart/notetaker.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 8
[Credential-related source omitted] - Network accessline 9
[Credential-related source omitted] - Access to secretsline 9
[Credential-related source omitted] - Network accessline 10
* node notetaker.js "https://meet.google.com/abc-def-ghi" - Network accessline 11
* * # Optional: customize bot name and output * node notetaker.js "https://meet.google.com/abc-def-ghi" --name "Scribe" --output summary.md - Network accessline 12
* # Optional: customize bot name and output * node notetaker.js "https://meet.google.com/abc-def-ghi" --name "Scribe" --output summary.md * - Network accessline 13
* node notetaker.js "https://meet.google.com/abc-def-ghi" --name "Scribe" --output summary.md - Network accessline 34
const API_BASE = process.env.AGENTCALL_API_URL || _cfg.api_url || "https://api.agentcall.dev"; - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 140
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Network accessline 153
// const OpenAI = require("openai"); // const client = new OpenAI({ // baseURL: "http://localhost:11434/v1", // Ollama - Network accessline 154
[Credential-related source omitted] - Network accessline 155
// baseURL: "http://localhost:11434/v1", // Ollama - Network accessline 174
async function createCall(meetUrl, botName) { const resp = await fetch(`${API_BASE}/v1/calls`, { - Network accessline 175
const resp = await fetch(`${API_BASE}/v1/calls`, { - Network accessline 190
async function fetchTranscript(callId) { const resp = await fetch( - Network accessline 191
const resp = await fetch( - Network accessline 348
async function cleanup(callId) { try { await fetch(`${API_BASE}/calls/${callId}`, { method: "DELETE", headers: HEADERS }); - Network accessline 349
try { await fetch(`${API_BASE}/calls/${callId}`, { method: "DELETE", headers: HEADERS }); console.log("Call ended (cleanup)"); - Network accessline 350
await fetch(`${API_BASE}/calls/${callId}`, { method: "DELETE", headers: HEADERS });
examples/notetaker-smart/notetaker.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 8
[Credential-related source omitted] - Access to secretsline 9
[Credential-related source omitted] - Network accessline 10
python notetaker.py "https://meet.google.com/abc-def-ghi" - Network accessline 12
# Optional: customize bot name and output python notetaker.py "https://meet.google.com/abc-def-ghi" --name "Scribe" --output summary.md - Network accessline 13
python notetaker.py "https://meet.google.com/abc-def-ghi" --name "Scribe" --output summary.md - Network accessline 35
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 114
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Network accessline 144
# # client = OpenAI( # base_url="http://localhost:11434/v1", # Ollama - Network accessline 145
[Credential-related source omitted] - Network accessline 146
# base_url="http://localhost:11434/v1", # Ollama - Access to secretsline 147
[Credential-related source omitted] - Network accessline 163
def create_call(meet_url: str, bot_name: str) -> dict: resp = requests.post( - Network accessline 164
resp = requests.post( - Network accessline 179
def fetch_transcript(call_id: str) -> Optional[dict]: resp = requests.get(f"{API_BASE}/v1/calls/{call_id}/transcript?format=json", headers=HEADERS) - Network accessline 180
resp = requests.get(f"{API_BASE}/v1/calls/{call_id}/transcript?format=json", headers=HEADERS) - Network accessline 287
print("Ending call...") try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 288
try: requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 289
requests.delete(f"{API_BASE}/v1/calls/{call_id}", headers=HEADERS) - Network accessline 337
except KeyboardInterrupt: print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) - Network accessline 338
print("\nInterrupted — cleaning up...") requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS) print("Call ended (cleanup)") - Network accessline 339
requests.delete(f"{API_BASE}/v1/calls/{call['call_id']}", headers=HEADERS)
examples/support-agent/README.md
- Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Network accessline 51
python agent.py "https://meet.google.com/abc-def-ghi" - Network accessline 57
# Custom bot name python agent.py "https://meet.google.com/abc" --name "Sarah" - Network accessline 58
python agent.py "https://meet.google.com/abc" --name "Sarah" - Network accessline 60
# Custom TTS voice (54 voices available) python agent.py "https://meet.google.com/abc" --voice af_bella - Network accessline 61
python agent.py "https://meet.google.com/abc" --voice af_bella - Network accessline 63
# Custom output file python agent.py "https://meet.google.com/abc" --output call-log.md - Network accessline 64
python agent.py "https://meet.google.com/abc" --output call-log.md
examples/support-agent/agent.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 10
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted] - Network accessline 12
python agent.py "https://meet.google.com/abc-def-ghi" - Network accessline 14
# Custom voice and bot name python agent.py "https://meet.google.com/abc" --name "Sarah" --voice af_bella - Network accessline 15
python agent.py "https://meet.google.com/abc" --name "Sarah" --voice af_bella - Network accessline 50
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 156
[Credential-related source omitted] - Access to secretsline 175
[Credential-related source omitted] - Access to secretsline 191
[Credential-related source omitted] - Access to secretsline 195
[Credential-related source omitted] - Network accessline 209
[Credential-related source omitted] - Network accessline 210
[Credential-related source omitted] - Network accessline 211
[Credential-related source omitted] - Access to secretsline 211
[Credential-related source omitted] - Network accessline 234
def create_call(meet_url: str, bot_name: str) -> dict: resp = requests.post( - Network accessline 235
resp = requests.post( - Network accessline 415
epilog=""" Examples: python agent.py "https://meet.google.com/abc-def-ghi" - Network accessline 416
Examples: python agent.py "https://meet.google.com/abc-def-ghi" python agent.py "https://meet.google.com/abc" --name "Sarah" --voice af_bella - Network accessline 417
python agent.py "https://meet.google.com/abc-def-ghi" - Network accessline 418
python agent.py "https://meet.google.com/abc" --name "Sarah" --voice af_bella - Network accessline 419
python agent.py "https://meet.google.com/abc" --output call-log.md
references/api.md
- Network accessline 11
# 1. Register curl -X POST https://api.agentcall.dev/v1/auth/register \ - Network accessline 12
curl -X POST https://api.agentcall.dev/v1/auth/register \ - Network accessline 17
# 2. Login (get JWT) curl -X POST https://api.agentcall.dev/v1/auth/login \ - Network accessline 18
curl -X POST https://api.agentcall.dev/v1/auth/login \ - Network accessline 23
# 3. Create API key (using JWT) curl -X POST https://api.agentcall.dev/v1/auth/api-keys \ - Network accessline 24
curl -X POST https://api.agentcall.dev/v1/auth/api-keys \ - Network accessline 31
# Check credit balance curl https://api.agentcall.dev/v1/auth/credits \ - Network accessline 32
curl https://api.agentcall.dev/v1/auth/credits \ - Access to secretsline 37
[Credential-related source omitted] - Network accessline 46
{ "meet_url": "https://meet.google.com/abc-def-ghi", - Network accessline 47
"meet_url": "https://meet.google.com/abc-def-ghi", - Network accessline 57
"voice": "voice.heart" }, "webhook_url": "https://my-server.com/webhooks", - Network accessline 58
}, "webhook_url": "https://my-server.com/webhooks", "event_filter": ["transcript.final", "participant.joined"], - Network accessline 59
"webhook_url": "https://my-server.com/webhooks", - Network accessline 68
"delay_seconds": 60 }, "webpage_url": "https://your-site.com/bot", - Network accessline 69
}, "webpage_url": "https://your-site.com/bot", "screenshare_url": "https://your-site.com/screenshare" - Network accessline 70
"webpage_url": "https://your-site.com/bot", - Network accessline 71
"screenshare_url": "https://your-site.com/screenshare" - Network accessline 79
"status": "bot_joining", "ws_url": "wss://api.agentcall.dev/v1/calls/call-550e.../ws", "tunnel_url": "https://x8f2k.conn.agentcall.dev/k/a7b2c.../ui", - Network accessline 80
"ws_url": "wss://api.agentcall.dev/v1/calls/call-550e.../ws", "tunnel_url": "https://x8f2k.conn.agentcall.dev/k/a7b2c.../ui", "tunnel_id": "tun-a7b2c...", - Network accessline 81
"tunnel_url": "https://x8f2k.conn.agentcall.dev/k/a7b2c.../ui", - Network accessline 97
"call_id": "call-550e8400-e29b-41d4-a716-446655440000", "status": "bot_ready", "meet_url": "https://meet.google.com/abc-def-ghi", - Network accessline 98
"status": "bot_ready", "meet_url": "https://meet.google.com/abc-def-ghi", "bot_name": "June", - Network accessline 99
"meet_url": "https://meet.google.com/abc-def-ghi", - Network accessline 114
"call_id": "call-550e8400...", "status": "bot_ready", "meet_url": "https://meet.google.com/abc-def-ghi", - Network accessline 115
"status": "bot_ready", "meet_url": "https://meet.google.com/abc-def-ghi", "bot_name": "June", - Network accessline 116
"meet_url": "https://meet.google.com/abc-def-ghi", - Access to secretsline 187
[Credential-related source omitted]
references/guides/bring-your-own-voice.md
- Access to secretsline 32
[Credential-related source omitted]
references/guides/collaborative-mode.md
- Network accessline 31
call = await client.create_call( meet_url="https://meet.google.com/abc-def-ghi", - Network accessline 32
meet_url="https://meet.google.com/abc-def-ghi", - Access to secretsline 392
[Credential-related source omitted] - Network accessline 394
call = await client.create_call( meet_url="https://meet.google.com/abc-def-ghi", - Network accessline 395
meet_url="https://meet.google.com/abc-def-ghi",
references/guides/crash-recovery.md
- Network accessline 133
{ "call_id": "call-abc123", "meet_url": "https://meet.google.com/xyz", - Network accessline 134
"call_id": "call-abc123", "meet_url": "https://meet.google.com/xyz", "mode": "audio", - Network accessline 135
"meet_url": "https://meet.google.com/xyz", - Access to secretsline 155
[Credential-related source omitted] - Network accessline 175
# Create new call call = await client.create_call( meet_url="https://meet.google.com/abc", - Network accessline 176
call = await client.create_call( meet_url="https://meet.google.com/abc", mode="audio", - Network accessline 177
meet_url="https://meet.google.com/abc",
references/guides/interruption-handling.md
references/guides/ui-templates.md
- Network accessline 188
3. Handle events: `voice.state`, `tts.webpage_audio`, `tts.audio_clear` 4. If building a voice agent: call `getUserMedia` on page load (see above) 5. Host locally (`--ui-port 3000`) or publicly (`--webpage-url`). For local hosting, referenc - Network accessline 190
5. Host locally (`--ui-port 3000`) or publicly (`--webpage-url`). For local hosting, reference your files with **relative paths** (`app.js`, `fetch('data.json')`), not `/app.js`: the tunnel serves the page under a per-call prefix, and absol
references/guides/webpage-audio.md
references/guides/webpage-av-screenshare.md
- Network accessline 32
# Both local (tunneled) ./scripts/run.sh https://meet.google.com/abc \ - Network accessline 33
./scripts/run.sh https://meet.google.com/abc \ - Network accessline 38
# Avatar public, screenshare local ./scripts/run.sh https://meet.google.com/abc \ - Network accessline 39
./scripts/run.sh https://meet.google.com/abc \ - Network accessline 40
--mode webpage-av-screenshare \ --webpage-url https://brand.com/avatar \ --screenshare-port 3001 - Network accessline 41
--webpage-url https://brand.com/avatar \ - Network accessline 44
# Both public (no tunnels) ./scripts/run.sh https://meet.google.com/abc \ - Network accessline 45
./scripts/run.sh https://meet.google.com/abc \ - Network accessline 46
--mode webpage-av-screenshare \ --webpage-url https://brand.com/avatar \ --screenshare-url https://slides.com/deck - Network accessline 47
--webpage-url https://brand.com/avatar \ - Network accessline 48
--screenshare-url https://slides.com/deck - Network accessline 119
async function poll() { try { const r = await fetch('/state.json?t=' + Date.now()); - Network accessline 120
try { const r = await fetch('/state.json?t=' + Date.now()); const state = await r.json(); - Network accessline 121
const r = await fetch('/state.json?t=' + Date.now()); - Network accessline 151
// Share a public URL {"command": "screenshare.start", "url": "https://your-slides.com/deck"} - Network accessline 152
{"command": "screenshare.start", "url": "https://your-slides.com/deck"} - Network accessline 191
{"command": "screenshare.swap", "port": 3002} {"command": "screenshare.swap", "url": "https://different-page.com"} - Network accessline 192
{"command": "screenshare.swap", "url": "https://different-page.com"} - Network accessline 197
1. **"Old content keeps showing"** — for local-port swaps the tunnel URL is byte-identical (`https://tunnel/screenshare/`), so FirstCall's headless browser would otherwise see "same URL — don't reload." The cache-buster (`?_acv=<ms>`) force
references/guides/webpage-av.md
- Network accessline 61
let lastState = ''; setInterval(async () => { const r = await fetch('/state.json?t=' + Date.now()); - Network accessline 62
setInterval(async () => { const r = await fetch('/state.json?t=' + Date.now()); const text = await r.text(); - Network accessline 63
const r = await fetch('/state.json?t=' + Date.now()); - Network accessline 96
Example: An existing customer support voice agent at `https://support.acme.com/agent` - Network accessline 100
./scripts/run.sh https://meet.google.com/abc-def-ghi \ - Network accessline 102
--webpage-url https://support.acme.com/agent
scripts/node/agentcall.js
- Executable scriptline 1
Executable file - Network accessline 23
[Credential-related source omitted] - Network accessline 24
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Network accessline 25
this.baseURL = baseURL || process.env.AGENTCALL_API_URL || cfg.api_url || 'https://api.agentcall.dev'; - Network accessline 37
}; if (body) opts.body = JSON.stringify(body); const resp = await fetch(url, opts); - Network accessline 38
if (body) opts.body = JSON.stringify(body); const resp = await fetch(url, opts); if (!resp.ok) { - Network accessline 39
const resp = await fetch(url, opts); - Access to secretsline 73
[Credential-related source omitted]
scripts/node/bridge-visual.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 20
* * Additional stdin commands: * {"command": "screenshare.start", "url": "https://slides.google.com/..."} - Network accessline 21
* Additional stdin commands: * {"command": "screenshare.start", "url": "https://slides.google.com/..."} * {"command": "screenshare.start", "port": 3001} - Network accessline 22
* {"command": "screenshare.start", "url": "https://slides.google.com/..."} - Network accessline 23
* {"command": "screenshare.start", "port": 3001} * {"command": "screenshare.swap", "port": 3002} // atomic stop+start * {"command": "screenshare.swap", "url": "https://..."} // atomic stop+start - Network accessline 24
* {"command": "screenshare.swap", "port": 3002} // atomic stop+start * {"command": "screenshare.swap", "url": "https://..."} // atomic stop+start * {"command": "screenshare.stop"} - Network accessline 25
* {"command": "screenshare.swap", "url": "https://..."} // atomic stop+start - Network accessline 36
[Credential-related source omitted] - Network accessline 37
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Network accessline 38
* node bridge-visual.js "https://meet.google.com/abc" --name "Claude" - Network accessline 39
* node bridge-visual.js "https://meet.google.com/abc" --webpage-url "https://your-site.com/avatar" - Network accessline 40
* node bridge-visual.js "https://meet.google.com/abc" --ui-port 3000 - Network accessline 62
// FirstCall's headless browser caches the screenshare URL aggressively — a swap // from one local port to another keeps showing the OLD content because the URL // (https://tunnel/screenshare/) doesn't change. - Network accessline 63
// from one local port to another keeps showing the OLD content because the URL // (https://tunnel/screenshare/) doesn't change. // - Network accessline 64
// (https://tunnel/screenshare/) doesn't change. - Network accessline 136
const API_BASE = process.env.AGENTCALL_API_URL || _cfg.api_url || 'https://api.agentcall.dev'; - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Access to secretsline 140
[Credential-related source omitted] - Access to secretsline 792
[Credential-related source omitted] - Network accessline 793
}; if (body) opts.body = JSON.stringify(body); const resp = await fetch(url, opts); - Network accessline 794
if (body) opts.body = JSON.stringify(body); const resp = await fetch(url, opts); if (!resp.ok) { - Network accessline 795
const resp = await fetch(url, opts); - Access to secretsline 820
[Credential-related source omitted] - Access to secretsline 941
[Credential-related source omitted]
scripts/node/bridge.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 23
[Credential-related source omitted] - Network accessline 24
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Network accessline 25
* node bridge.js "https://meet.google.com/abc-def-ghi" - Network accessline 26
* * # Custom bot name, voice, and VAD cooldown * node bridge.js "https://meet.google.com/abc" --name "Claude" --voice af_bella --vad-timeout 2.0 - Network accessline 27
* # Custom bot name, voice, and VAD cooldown * node bridge.js "https://meet.google.com/abc" --name "Claude" --voice af_bella --vad-timeout 2.0 * - Network accessline 28
* node bridge.js "https://meet.google.com/abc" --name "Claude" --voice af_bella --vad-timeout 2.0 - Network accessline 61
const API_BASE = process.env.AGENTCALL_API_URL || _cfg.api_url || 'https://api.agentcall.dev'; - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 432
[Credential-related source omitted] - Network accessline 435
}; if (body) opts.body = JSON.stringify(body); const resp = await fetch(url, opts); - Network accessline 436
if (body) opts.body = JSON.stringify(body); const resp = await fetch(url, opts); if (!resp.ok) { - Network accessline 437
const resp = await fetch(url, opts); - Access to secretsline 462
[Credential-related source omitted] - Access to secretsline 527
[Credential-related source omitted]
scripts/node/check_update.js
scripts/node/join.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 26
triggerWords: '', context: '', apiURL: 'https://api.agentcall.dev', - Network accessline 27
context: '', apiURL: 'https://api.agentcall.dev', }; - Network accessline 28
apiURL: 'https://api.agentcall.dev', - Access to secretsline 94
[Credential-related source omitted] - Access to secretsline 96
[Credential-related source omitted]
scripts/node/package.json
- Executable scriptline 1
Executable file
scripts/node/register.js
- Executable scriptline 1
#!/usr/bin/env node - Network accessline 24
const CONFIG_PATH = join(homedir(), '.agentcall', 'config.json'); const DEFAULT_API_URL = 'https://api.agentcall.dev'; - Network accessline 25
const DEFAULT_API_URL = 'https://api.agentcall.dev'; - Access to secretsline 70
[Credential-related source omitted]
scripts/node/stdin-commands.js
- Executable scriptline 1
Executable file
scripts/node/tunnel.js
- Executable scriptline 1
Executable file
scripts/python/agentcall.py
- Executable scriptline 1
Executable file - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 46
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Network accessline 47
[Credential-related source omitted] - Access to secretsline 47
[Credential-related source omitted] - Network accessline 48
self.base_url = base_url or load_api_url() or "https://api.agentcall.dev" - Network accessline 51
async def _get_session(self) -> aiohttp.ClientSession: if self._session is None or self._session.closed: self._session = aiohttp.ClientSession( - Network accessline 52
[Credential-related source omitted] - Network accessline 53
self._session = aiohttp.ClientSession( - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted]
scripts/python/bridge-visual.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 23
Additional stdout events: {"event": "screenshare.started", "url": "https://..."} - Network accessline 24
{"event": "screenshare.started", "url": "https://..."} - Network accessline 28
Additional stdin commands: {"command": "screenshare.start", "url": "https://slides.google.com/..."} - Network accessline 29
{"command": "screenshare.start", "url": "https://slides.google.com/..."} - Network accessline 30
{"command": "screenshare.start", "port": 3001} {"command": "screenshare.swap", "port": 3002} — atomic stop+start {"command": "screenshare.swap", "url": "https://..."} — atomic stop+start - Network accessline 31
{"command": "screenshare.swap", "port": 3002} — atomic stop+start {"command": "screenshare.swap", "url": "https://..."} — atomic stop+start {"command": "screenshare.stop"} - Network accessline 32
{"command": "screenshare.swap", "url": "https://..."} — atomic stop+start - Access to secretsline 43
[Credential-related source omitted] - Network accessline 45
# With built-in avatar template (starts local server + tunnel automatically) python bridge-visual.py "https://meet.google.com/abc" --name "Claude" - Network accessline 46
python bridge-visual.py "https://meet.google.com/abc" --name "Claude" - Network accessline 48
# With public webpage as bot's video feed (no tunnel needed) python bridge-visual.py "https://meet.google.com/abc" --webpage-url "https://your-site.com/avatar" - Network accessline 49
python bridge-visual.py "https://meet.google.com/abc" --webpage-url "https://your-site.com/avatar" - Network accessline 51
# With custom local UI on port 3000 (tunnel auto-started) python bridge-visual.py "https://meet.google.com/abc" --ui-port 3000 - Network accessline 52
python bridge-visual.py "https://meet.google.com/abc" --ui-port 3000 - Network accessline 86
# These exist because FirstCall's headless browser caches the screenshare URL # aggressively — a swap from one local port to another keeps showing the OLD # content because the URL (https://tunnel/screenshare/) doesn't change. - Network accessline 87
# aggressively — a swap from one local port to another keeps showing the OLD # content because the URL (https://tunnel/screenshare/) doesn't change. # - Network accessline 88
# content because the URL (https://tunnel/screenshare/) doesn't change. - Network accessline 100
try: with socket.create_connection((host, port), timeout=timeout): - Network accessline 101
with socket.create_connection((host, port), timeout=timeout): - Network accessline 291
[Credential-related source omitted] - Access to secretsline 291
[Credential-related source omitted] - Access to secretsline 292
[Credential-related source omitted] - Access to secretsline 294
[Credential-related source omitted] - Access to secretsline 295
[Credential-related source omitted] - Network accessline 620
async def _get_session(self) -> aiohttp.ClientSession: if self.session is None or self.session.closed: self.session = aiohttp.ClientSession( - Network accessline 621
[Credential-related source omitted] - Network accessline 622
self.session = aiohttp.ClientSession( - Access to secretsline 623
[Credential-related source omitted] - Access to secretsline 665
[Credential-related source omitted] - Network accessline 873
if path.startswith("/screenshare") and self.screenshare_port: local_path = path[len("/screenshare"):] or "/" return f"http://localhost:{self.screenshare_port}{local_path}" - Network accessline 874
local_path = path[len("/screenshare"):] or "/" return f"http://localhost:{self.screenshare_port}{local_path}" if path.startswith("/webpage") and self.webpage_port: - Network accessline 875
return f"http://localhost:{self.screenshare_port}{local_path}" - Network accessline 876
if path.startswith("/webpage") and self.webpage_port: local_path = path[len("/webpage"):] or "/" return f"http://localhost:{self.webpage_port}{local_path}" - Network accessline 877
local_path = path[len("/webpage"):] or "/" return f"http://localhost:{self.webpage_port}{local_path}" if path.startswith("/ui"): - Network accessline 878
return f"http://localhost:{self.webpage_port}{local_path}" - Network accessline 879
if path.startswith("/ui"): local_path = path[len("/ui"):] or "/" return f"http://localhost:{self.ui_port}{local_path}" - Network accessline 880
local_path = path[len("/ui"):] or "/" return f"http://localhost:{self.ui_port}{local_path}" return f"http://localhost:{self.ui_port}{path}" - Network accessline 881
return f"http://localhost:{self.ui_port}{local_path}" - Network accessline 882
return f"http://localhost:{self.ui_port}{path}" - Possible obfuscationline 911
body = base64.b64decode(raw_body) if binary else raw_body.encode() - Network accessline 918
async with aiohttp.ClientSession(auto_decompress=not binary) as session: - Network accessline 1180
# Start screensharing. Accepts either: # {"command": "screenshare.start", "url": "https://..."} — public URL - Network accessline 1181
# {"command": "screenshare.start", "url": "https://..."} — public URL - Network accessline 1790
python bridge-visual.py "https://meet.google.com/abc" --name Claude - Network accessline 1793
python bridge-visual.py "https://meet.google.com/abc" --webpage-url "https://your-site.com/avatar" - Network accessline 1796
python bridge-visual.py "https://meet.google.com/abc" --screenshare-port 3001 - Network accessline 1799
stdin: {"command": "screenshare.start", "url": "https://slides.google.com/..."}
scripts/python/bridge.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 42
stdin commands (agent → bridge): {"command": "tts.speak", "text": "Health check returned OK", "voice": "af_heart"} {"command": "send_chat", "message": "Here's the URL: https://..."} - Network accessline 43
{"command": "tts.speak", "text": "Health check returned OK", "voice": "af_heart"} {"command": "send_chat", "message": "Here's the URL: https://..."} {"command": "raise_hand"} - Network accessline 44
{"command": "send_chat", "message": "Here's the URL: https://..."} - Network accessline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Network accessline 61
python bridge.py "https://meet.google.com/abc-def-ghi" - Network accessline 63
# Custom bot name, voice, and VAD cooldown python bridge.py "https://meet.google.com/abc" --name "Claude" --voice af_bella --vad-timeout 2.0 - Network accessline 64
python bridge.py "https://meet.google.com/abc" --name "Claude" --voice af_bella --vad-timeout 2.0 - Network accessline 237
[Credential-related source omitted] - Access to secretsline 237
[Credential-related source omitted] - Access to secretsline 238
[Credential-related source omitted] - Access to secretsline 240
[Credential-related source omitted] - Access to secretsline 241
[Credential-related source omitted] - Network accessline 504
async def _get_session(self) -> aiohttp.ClientSession: if self.session is None or self.session.closed: self.session = aiohttp.ClientSession( - Network accessline 505
[Credential-related source omitted] - Network accessline 506
self.session = aiohttp.ClientSession( - Access to secretsline 507
[Credential-related source omitted] - Access to secretsline 538
[Credential-related source omitted]
scripts/python/check_update.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 23
REPO_URL = "https://github.com/pattern-ai-labs/agentcall" - Network accessline 24
GITHUB_PLUGIN_URL = "https://raw.githubusercontent.com/pattern-ai-labs/agentcall/main/.claude-plugin/plugin.json" - Network accessline 104
def fetch_latest_version() -> str: req = urllib.request.Request( - Network accessline 105
req = urllib.request.Request( - Network accessline 107
headers={"Accept": "application/json", "User-Agent": "agentcall-skill-update-check"}, ) with urllib.request.urlopen(req, timeout=FETCH_TIMEOUT) as resp: - Network accessline 108
) with urllib.request.urlopen(req, timeout=FETCH_TIMEOUT) as resp: data = json.load(resp) - Network accessline 109
with urllib.request.urlopen(req, timeout=FETCH_TIMEOUT) as resp:
scripts/python/join.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 35
parser.add_argument("--trigger-words", default="") parser.add_argument("--context", default="") parser.add_argument("--api-url", default="https://api.agentcall.dev") - Network accessline 36
parser.add_argument("--context", default="") parser.add_argument("--api-url", default="https://api.agentcall.dev") return parser.parse_args() - Network accessline 37
parser.add_argument("--api-url", default="https://api.agentcall.dev") - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted]
scripts/python/register.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 26
CONFIG_PATH = Path.home() / ".agentcall" / "config.json" DEFAULT_API_URL = "https://api.agentcall.dev" - Network accessline 27
DEFAULT_API_URL = "https://api.agentcall.dev" - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Network accessline 44
req = urllib.request.Request(url, data=json.dumps(body).encode(), method="POST") - Network accessline 47
req.add_header("Authorization", f"Bearer {token}") try: with urllib.request.urlopen(req, timeout=30) as resp: - Network accessline 48
try: with urllib.request.urlopen(req, timeout=30) as resp: return resp.status, json.loads(resp.read() or "{}") - Network accessline 49
with urllib.request.urlopen(req, timeout=30) as resp: - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted]
scripts/python/tunnel.py
- Executable scriptline 1
Executable file - Access to secretsline 5
[Credential-related source omitted] - Possible obfuscationline 37
return base64.b64decode(body) - Network accessline 131
binary = payload.get("body_encoding") == "base64" async with aiohttp.ClientSession(auto_decompress=not binary) as session: - Network accessline 132
async with aiohttp.ClientSession(auto_decompress=not binary) as session:
scripts/run.sh
- Executable scriptline 1
#!/bin/bash
tests/stdin_commands_node.test.mjs
- Executable scriptline 1
Executable file
tests/test_bridge_stdin.py
tests/test_bridge_visual_stdin.py
- Executable scriptline 1
Executable file - Access to secretsline 22
[Credential-related source omitted] - Network accessline 100
bridge = load_bridge() sent, events, _ = asyncio.run(run_stdin_lines(bridge, [ {"command": "screenshare.start", "url": "https://example.com/slides"}, - Network accessline 101
sent, events, _ = asyncio.run(run_stdin_lines(bridge, [ {"command": "screenshare.start", "url": "https://example.com/slides"}, {"command": "screenshare.stop"}, - Network accessline 102
{"command": "screenshare.start", "url": "https://example.com/slides"}, - Network accessline 103
{"command": "screenshare.stop"}, {"command": "screenshare.swap", "url": "https://example.com/next"}, ])) - Network accessline 104
{"command": "screenshare.swap", "url": "https://example.com/next"},
ui-templates/agentcall-audio.js
ui-templates/avatar/index.html
- Network accessline 171
} }); const avatarURL = params.get('avatar') || 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="45" fill="%23333"/><circle cx="50" cy="40" r="18" fill="%23666"/><ellipse cx="50" c - Network accessline 172
}); const avatarURL = params.get('avatar') || 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="45" fill="%23333"/><circle cx="50" cy="40" r="18" fill="%23666"/><ellipse cx="50" cy= - Network accessline 173
const avatarURL = params.get('avatar') || 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="50" r="45" fill="%23333"/><circle cx="50" cy="40" r="18" fill="%23666"/><ellipse cx="50" cy="75" - Network accessline 225
async function pollTasks() { try { const r = await fetch('tasks.json', { cache: 'no-store' }); - Network accessline 226
try { const r = await fetch('tasks.json', { cache: 'no-store' }); if (!r.ok) return; - Network accessline 227
const r = await fetch('tasks.json', { cache: 'no-store' });
ui-templates/orb/index.html
- Network accessline 148
async function pollTasks() { try { const r = await fetch('tasks.json', { cache: 'no-store' }); - Network accessline 149
try { const r = await fetch('tasks.json', { cache: 'no-store' }); if (!r.ok) return; - Network accessline 150
const r = await fetch('tasks.json', { cache: 'no-store' });
ui-templates/pattern/index.html
- Network accessline 344
async function pollTasks() { try { const r = await fetch('tasks.json', { cache: 'no-store' }); - Network accessline 345
try { const r = await fetch('tasks.json', { cache: 'no-store' }); if (!r.ok) return; - Network accessline 346
const r = await fetch('tasks.json', { cache: 'no-store' });
ui-templates/ring/index.html
- Network accessline 204
async function pollTasks() { try { const r = await fetch('tasks.json', { cache: 'no-store' }); - Network accessline 205
try { const r = await fetch('tasks.json', { cache: 'no-store' }); if (!r.ok) return; - Network accessline 206
const r = await fetch('tasks.json', { cache: 'no-store' });
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 2 facts
- Contacts api.elevenlabs.io, which SKILL.md, the README and the plugin manifest do not mentionexamples/elevenlabs-voice/agent.js:139High confidence
- Contacts api.elevenlabs.io, which SKILL.md, the README and the plugin manifest do not mentionexamples/elevenlabs-voice/agent.py:130High confidence
Signal confidence: 498 facts
- Network access in prose of documentationCHANGELOG.md:85Low confidence
- Network access in prose of documentationCHANGELOG.md:87Low confidence
- Network access in prose of documentationREADME.md:5Low confidence
- Network access in prose of documentationREADME.md:38Low confidence
- Network access in prose of documentationREADME.md:39Low confidence
- Network access in prose of documentationREADME.md:40Low confidence
- Network access in prose of documentationREADME.md:54Low confidence
- Network access in code of documentationREADME.md:73Low confidence
- Network access in code of documentationREADME.md:81Low confidence
- Network access in prose of documentationREADME.md:91Low confidence
- Network access in prose of documentationREADME.md:95Low confidence
- Network access in prose of documentationREADME.md:99Low confidence
- Network access in prose of documentationREADME.md:149Low confidence
- Network access in prose of documentationREADME.md:150Low confidence
- Network access in prose of documentationREADME.md:151Low confidence
- Network access in prose of documentationREADME.md:152Low confidence
- Network access in prose of documentationREADME.md:153Low confidence
- Network access in prose of documentationREADME.md:154Low confidence
- Network access in prose of documentationREADME.md:155Low confidence
- Network access in prose of documentationREADME.md:157Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueREADME.md:159Low confidence
- Network access in prose of documentationREADME.md:165Low confidence
- Network access in prose of documentationREADME.md:175Low confidence
- Network access in prose of documentationREADME.md:176Low confidence
- Network access in prose of documentationREADME.md:184Low confidence
- Access to secrets in prose of the SKILL.mdSKILL.md:42Low confidence
- Access to secrets in prose of the SKILL.mdSKILL.md:43Low confidence
- Network access in prose of the SKILL.mdSKILL.md:66Low confidence
- Network access in prose of the SKILL.mdSKILL.md:67Low confidence
- Access to secrets in code of the SKILL.mdSKILL.md:71High confidence
- Access to secrets in prose of the SKILL.mdSKILL.md:76Low confidence
- Network access in prose of the SKILL.mdSKILL.md:108Low confidence
- Network access in prose of the SKILL.mdSKILL.md:109Low confidence
- Access to secrets in code of the SKILL.mdSKILL.md:115High confidence
- Network access in prose of the SKILL.mdSKILL.md:152Low confidence
- Network access in prose of the SKILL.mdSKILL.md:153Low confidence
- Network access in prose of the SKILL.mdSKILL.md:154Low confidence
- Network access in prose of the SKILL.mdSKILL.md:155Low confidence
- Network access in prose of the SKILL.mdSKILL.md:157Low confidence
- Network access in prose of the SKILL.mdSKILL.md:189Low confidence
- Network access in prose of the SKILL.mdSKILL.md:226Low confidence
- Network access in prose of the SKILL.mdSKILL.md:227Low confidence
- Network access in prose of the SKILL.mdSKILL.md:228Low confidence
- Network access in prose of the SKILL.mdSKILL.md:230Low confidence
- Network access in prose of the SKILL.mdSKILL.md:322Low confidence
- Network access in prose of the SKILL.mdSKILL.md:615Low confidence
- Network access in prose of the SKILL.mdSKILL.md:617Low confidence
- Network access in prose of the SKILL.mdSKILL.md:620Low confidence
- Network access in prose of the SKILL.mdSKILL.md:621Low confidence
- Network access in prose of the SKILL.mdSKILL.md:622Low confidence
and 448 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Native | Manifest gemini-extension.json | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.