Skip to content

Builtin Skills

Fresh

Built-in Skills

For AI agents: a documentation index is available at the root level at /llms.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.

Available Skills

SkillDescriptionRequirements
datetimeDate/time informationpytz
mathMathematical calculations(none)
web_searchWeb search via Google APIAPI key
wikipedia_searchWikipedia lookups(none)
weather_apiWeather informationAPI key
jokeTell jokes(none)
play_background_filePlay audio files(none)
swml_transferTransfer to SWML endpoint(none)
datasphereDataSphere document searchAPI credentials
native_vector_searchLocal vector searchsearch extras
mcp_gatewayMCP server integrationMCP Gateway service
google_mapsAddress validation & routingGoogle Maps API key
info_gathererStructured question collection(none)
claude_skillsLoad SKILL.md files as toolsPyYAML
api_ninjas_triviaTrivia questions from API NinjasAPI key
ask_claudeAnthropic Claude reasoning / sub-queriesANTHROPIC_API_KEY
custom_skillsRegister one-off SWAIG tools from config(none)
datasphere_serverlessDataSphere search via DataMap (no server callback)API credentials
spiderWeb scraping & crawlingcheerio (TS) / lxml (Python)

datetime

Get current date and time information with timezone support. This is one of the most commonly used skills, callers often ask “what time is it?” or need scheduling help.

Functions:

  • get_current_time - Get current time in a timezone
  • get_current_date - Get today’s date

Requirements:pytz package (usually installed automatically)

Parameters:

This skill takes no configuration parameters. Timezone is specified per call via the timezone argument on get_current_time; UTC is the default when omitted.

Output format:

  • Time: “The current time in America/New_York is 2:30 PM”
  • Date: “Today’s date is November 25, 2024”

Common use cases:

  • “What time is it?” / “What time is it in Tokyo?”
  • “What’s today’s date?”
  • Scheduling and appointment contexts
  • Time zone conversions

Limitations:

  • Requires valid timezone names (e.g., “America/New_York”, not “EST”)
  • Doesn’t do time math or calculate durations
  • Doesn’t handle historical dates
LanguageAdding datetime
Pythonself.add_skill("datetime")
TypeScriptawait agent.addSkillByName('datetime')
from signalwire import AgentBase

class TimeAgent(AgentBase):
    def __init__(self):
        super().__init__(name="time-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("datetime")

        self.prompt_add_section(
            "Role",
            "You help users with date and time information."
        )

math

Perform mathematical calculations safely. The skill uses a secure expression evaluator that supports common operations without executing arbitrary code.

Functions:

  • calculate - Evaluate mathematical expressions

Requirements: None

Parameters:

This skill takes no configuration parameters. The registered tool is always named calculate.

Supported operations:

  • Basic: +, -, *, /, ** (power), % (modulo)
  • Functions: sqrt, sin, cos, tan, log, abs, round
  • Constants: pi, e
  • Parentheses for grouping

Common use cases:

  • “What’s 15 percent of 230?”
  • “Calculate 45 times 67”
  • “What’s the square root of 256?”
  • Price calculations, tip calculations

Limitations:

  • Limited to supported functions (no arbitrary Python)
  • Large numbers may lose precision
  • Can’t solve equations or do symbolic math
from signalwire import AgentBase

class CalculatorAgent(AgentBase):
    def __init__(self):
        super().__init__(name="calculator")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("math")

        self.prompt_add_section(
            "Role",
            "You are a calculator that helps with math."
        )

Search the web using Google Custom Search API. Results are filtered for quality and summarized for voice delivery.

Functions:

  • web_search - Search the web and return summarized results

Requirements:

  • Google Custom Search API key (from Google Cloud Console)
  • Search Engine ID (from Programmable Search Engine)

Setup:

  1. Create a project in Google Cloud Console
  2. Enable the Custom Search JSON API
  3. Create an API key
  4. Create a Programmable Search Engine at https://programmablesearchengine.google.com/
  5. Get the Search Engine ID

Parameters:

ParameterTypeDescriptionDefault
api_keystringGoogle API key (falls back to GOOGLE_SEARCH_API_KEY)Required
search_engine_idstringSearch engine ID (falls back to GOOGLE_SEARCH_ENGINE_ID)Required
tool_namestringCustom function name (set per instance)“web_search”
num_resultsintegerResults to return3
delaynumberSeconds between requests0.5
max_content_lengthintegerMax characters of scraped page content32768
oversample_factornumberFetch extra results then re-rank2.5
min_quality_scorenumberQuality threshold (0-1)0.3
no_results_messagestringMessage returned when nothing matchesdefault
safe_searchstring"off", "medium", or "high"”medium”

Multi-instance support: Yes - add multiple instances with unique tool_name values (e.g. search_news, search_docs).

from signalwire import AgentBase

class SearchAgent(AgentBase):
    def __init__(self):
        super().__init__(name="search-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("web_search", {
            "api_key": "YOUR_GOOGLE_API_KEY",
            "search_engine_id": "YOUR_SEARCH_ENGINE_ID",
            "num_results": 3
        })

        self.prompt_add_section(
            "Role",
            "You search the web to answer questions."
        )

Search Wikipedia for information. A free, no-API-key alternative to web search for factual queries.

Functions:

  • search_wikipedia - Search and retrieve Wikipedia article summaries

Requirements: None (uses public Wikipedia API)

Parameters:

ParameterTypeDescriptionDefault
num_resultsintegerMax articles returned (1-5)1
no_results_messagestringMessage returned when nothing matchesdefault template
from signalwire import AgentBase

class WikiAgent(AgentBase):
    def __init__(self):
        super().__init__(name="wiki-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("wikipedia_search", {
            "num_results": 3  # Return up to three articles
        })

        self.prompt_add_section(
            "Role",
            "You look up information on Wikipedia to answer factual questions."
        )

weather_api

Get current weather information for locations worldwide. Commonly used for small talk, travel planning, and location-aware services.

Functions:

  • get_weather - Get current weather conditions for a location

Requirements: WeatherAPI.com API key (free tier available)

Setup:

  1. Sign up at https://www.weatherapi.com/
  2. Get your API key from the dashboard
  3. Free tier allows 1 million calls/month

Parameters:

ParameterTypeDescriptionDefault
api_keystringWeatherAPI.com API key (falls back to WEATHER_API_KEY)Required
tool_namestringCustom function name”get_weather”
unitsstring"metric", "imperial", "standard", "celsius", or "fahrenheit"”fahrenheit”
from signalwire import AgentBase

class WeatherAgent(AgentBase):
    def __init__(self):
        super().__init__(name="weather-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("weather_api", {
            "api_key": "YOUR_WEATHER_API_KEY"
        })

        self.prompt_add_section(
            "Role",
            "You provide weather information for any location."
        )

joke

Tell jokes to lighten the mood or entertain callers. Uses a curated joke database for clean, family-friendly humor.

Functions:

  • tell_joke - Get a random joke

Requirements: None

Parameters:

ParameterTypeDescriptionDefault
tool_namestringCustom function name”tell_joke”
from signalwire import AgentBase

class FunAgent(AgentBase):
    def __init__(self):
        super().__init__(name="fun-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("joke")

        self.prompt_add_section(
            "Role",
            "You are a fun assistant that tells jokes when asked."
        )

play_background_file

Play audio files in the background during calls. Audio plays while conversation continues, useful for hold music, ambient sound, or audio cues.

Functions:

  • play_background_file - Start playing audio file
  • stop_background_file - Stop currently playing audio

Requirements: None (audio file must be accessible via URL)

Parameters:

This skill supports two configuration styles:

  • Catalog mode, preload named files via files, caller selects by key:
ParameterTypeDescriptionDefault
tool_namestringCustom play function name”play_background_file”
filesarrayList of { key, description, url, wait? } entriesRequired
  • Free-form mode, caller supplies a URL at call time (gated by allowed_domains):
ParameterTypeDescriptionDefault
default_file_urlstringURL played when no argument is providedRequired
allowed_domainsarrayWhitelisted domains for caller-supplied URLsRequired

Supported formats: MP3, WAV, OGG

from signalwire import AgentBase

class MusicAgent(AgentBase):
    def __init__(self):
        super().__init__(name="music-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("play_background_file", {
            "files": [\
                {\
                    "key": "hold_music",\
                    "description": "Looping hold music",\
                    "url": "https://example.com/hold-music.mp3",\
                }\
            ]
        })

swml_transfer

Transfer calls to another SWML endpoint.

Functions:

  • transfer_call (default name) - Transfer based on matched pattern

Requirements: None

Parameters:

ParameterTypeDescriptionDefault
transfersobjectPattern → `{ urladdress, message?, return_message?, post_process?, final?, from_addr? }`
patternsarrayAlternative shape: list of pattern entriesRequired (or use transfers)
allow_arbitrarybooleanAccept caller-supplied URL instead of matching a patternfalse
tool_namestringCustom function name”transfer_call”
descriptionstringTool descriptiondefault
parameter_namestringArgument name the LLM supplies”transfer_type”
parameter_descriptionstringArgument descriptiondefault
default_messagestringMessage when no pattern matchesdefault
default_post_processbooleanDefault for transferred calls returning to the agentfalse
required_fieldsobjectExtra per-pattern required fields{}
from signalwire import AgentBase

class TransferAgent(AgentBase):
    def __init__(self):
        super().__init__(name="transfer-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("swml_transfer", {
            "transfers": {
                "specialist": {
                    "url": "https://your-server.com/other-agent",
                    "message": "Transferring you to a specialist."
                }
            }
        })

datasphere

Search SignalWire DataSphere documents.

Functions:

  • search_knowledge (default name) - Search uploaded documents

Requirements: DataSphere API credentials

Parameters:

ParameterTypeDescriptionDefault
space_namestringDataSphere space nameRequired
project_idstringProject ID (falls back to SIGNALWIRE_PROJECT_ID)Required
tokenstringAPI token (falls back to SIGNALWIRE_TOKEN)Required
document_idstringDocument ID to search withinRequired
tool_namestringCustom function name”search_knowledge”
countintegerResults to return (1-10)1
distancenumberDistance threshold (0-10)3.0
tagsarrayFilter by document tags,
languagestringLanguage filter,
pos_to_expandarrayPOS tags to expand (NOUN, VERB, ADJ, ADV),
max_synonymsintegerSynonym expansion limit (1-10),
no_results_messagestringMessage when nothing matchesdefault
from signalwire import AgentBase

class KnowledgeAgent(AgentBase):
    def __init__(self):
        super().__init__(name="knowledge-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("datasphere", {
            "space_name": "your-space",
            "project_id": "YOUR_PROJECT_ID",
            "token": "YOUR_API_TOKEN",
            "document_id": "your-document-id"
        })

Local vector search using .swsearch index files.

Functions:

  • Dynamic name (default search_knowledge) - Search a local vector index

Requirements: Search extras installed (pip install "signalwire-sdk[search]")

Parameters:

ParameterTypeDescriptionDefault
tool_namestringCustom function name”search_knowledge”
index_filestringSQLite .swsearch path (SQLite backend),
backendstring"sqlite" or "pgvector"”sqlite”
connection_stringstringPostgreSQL URL (pgvector backend),
collection_namestringTable/collection name (pgvector backend),
build_indexbooleanRebuild index on startupfalse
source_dirstringSource directory when building,
remote_urlstringRemote search-server URL (alternative to local index),
index_namestringNamed index on remote server”default”
countintegerResults to return (1-20)5
similarity_thresholdnumberMinimum score (0.0-1.0)0.0
tagsarrayFilter results by tag[]
global_tagsarrayAlways-applied tag filter[]
file_typesarrayFile extensions to index["md","txt","pdf","docx","html"]
exclude_patternsarrayGlob patterns to skipdefaults
no_results_messagestringMessage when nothing matchesdefault template
response_prefixstringPrepended to result text,
response_postfixstringAppended to result text,
max_content_lengthintegerMax result chars32768
descriptionstringTool description override,
from signalwire import AgentBase

class LocalSearchAgent(AgentBase):
    def __init__(self):
        super().__init__(name="local-search")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("native_vector_search", {
            "index_file": "/path/to/knowledge.swsearch",
            "tool_name": "search_docs"
        })

mcp_gateway

Connect to MCP (Model Context Protocol) servers via the MCP Gateway service. This skill dynamically creates SWAIG functions from MCP tools, enabling your agent to use any MCP-compatible tool.

Functions: Dynamically created based on connected MCP services

Requirements:

  • MCP Gateway service running
  • Gateway URL and authentication credentials

Parameters:

ParameterTypeDescriptionDefault
gateway_urlstringMCP Gateway service URLRequired
auth_userstringBasic auth usernameNone
auth_passwordstringBasic auth passwordNone
auth_tokenstringBearer token (alternative auth)None
servicesarrayServices and tools to enableAll
session_timeoutintegerSession timeout (seconds)300
tool_prefixstringPrefix for function names”mcp_“
retry_attemptsintegerConnection retries3
request_timeoutintegerRequest timeout (seconds)30
verify_sslbooleanVerify SSL certificatestrue

How it works:

  1. Skill connects to gateway and discovers available tools
  2. Each MCP tool becomes a SWAIG function (e.g., mcp_todo_add_todo)
  3. Sessions persist per call_id, enabling stateful tools
  4. Session automatically closes when call ends
from signalwire import AgentBase

class MCPAgent(AgentBase):
    def __init__(self):
        super().__init__(name="mcp-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("mcp_gateway", {
            "gateway_url": "http://localhost:8080",
            "auth_user": "admin",
            "auth_password": "secure-password",
            "services": [\
                {"name": "todo", "tools": "*"},\
                {"name": "calculator", "tools": ["add", "multiply"]}\
            ]
        })

        self.prompt_add_section(
            "Role",
            "You help users manage tasks and perform calculations."
        )

google_maps

Validate addresses and compute driving routes using Google Maps. Supports geocoding, spoken number normalization (e.g., “seven one four” becomes “714”), and location-biased search.

Functions:

  • lookup_address - Validate and geocode a street address or business name
  • compute_route - Compute driving distance and estimated travel time between two points

Requirements: Google Maps API key with Geocoding and Routes APIs enabled

Parameters:

ParameterTypeDescriptionDefault
api_keystringGoogle Maps API key (falls back to GOOGLE_MAPS_API_KEY)Required
lookup_tool_namestringAddress lookup function name”lookup_address”
route_tool_namestringRoute computation function name”compute_route”
geocode_tool_namestringReverse-geocoding function name”geocode_address”
route_by_coords_tool_namestringCoord-based route function name”compute_route_by_coords”
default_modestring"driving", "walking", "bicycling", or "transit"”driving”
from signalwire import AgentBase

class DeliveryAgent(AgentBase):
    def __init__(self):
        super().__init__(name="delivery-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("google_maps", {
            "api_key": "YOUR_GOOGLE_MAPS_API_KEY"
        })

        self.prompt_add_section(
            "Role",
            "You help customers verify delivery addresses and estimate delivery times."
        )

info_gatherer

Gather answers to a configurable list of questions. This is the skill version of the InfoGathererAgent prefab, designed to be embedded within larger agents.

Functions:

  • start_questions - Begin the question sequence
  • submit_answer - Submit an answer and get the next question

Requirements: None

Parameters:

ParameterTypeDescriptionDefault
questionslistList of question dictionaries (key_name, question_text, confirm, prompt_add)Required
prefixstringPrefix for tool names and namespace (enables multi-instance)None
completion_messagestringMessage read after the last questiondefault template

Multi-instance support: Yes - use the prefix parameter to run multiple question sets on a single agent. With prefix="intake", tools become intake_start_questions and intake_submit_answer, and state is stored under skill:intake in global_data.

from signalwire import AgentBase

class MultiFormAgent(AgentBase):
    def __init__(self):
        super().__init__(name="multi-form")
        self.add_language("English", "en-US", "rime.spore")

        # First question set
        self.add_skill("info_gatherer", {
            "prefix": "contact",
            "questions": [\
                {"key_name": "name", "question_text": "What is your name?"},\
                {"key_name": "email", "question_text": "What is your email?", "confirm": True}\
            ]
        })

        # Second question set
        self.add_skill("info_gatherer", {
            "prefix": "feedback",
            "questions": [\
                {"key_name": "rating", "question_text": "How would you rate our service?"},\
                {"key_name": "comments", "question_text": "Any additional comments?"}\
            ]
        })

claude_skills

Load Claude Code-style SKILL.md files as agent tools. Each SKILL.md file in the configured directory becomes a SWAIG function, with YAML frontmatter parsed for metadata (name, description, parameters).

Functions: Dynamically created from SKILL.md files (prefixed with claude_ by default)

Requirements: PyYAML package

Parameters:

ParameterTypeDescriptionDefault
skills_pathstringPath to directory containing SKILL.md filesRequired
includearrayGlob patterns of SKILL.md files to load["*"]
excludearrayGlob patterns to skip[]
tool_prefixstringPrefix for generated function names”claude_“
prompt_titlestringSection title added to agent prompt”Claude Skills”
prompt_introstringProse introducing the loaded skillsdefault template
skill_descriptionsobjectOverride descriptions, keyed by skill name{}
response_prefixstringPrepended to each skill response,
response_postfixstringAppended to each skill response,
allow_shell_injectionbooleanPermit shell metacharacters in argumentsfalse
allow_script_executionbooleanPermit running scripts referenced by a skillfalse
ignore_invocation_controlbooleanBypass per-skill invocation gatingfalse
shell_timeoutintegerShell command timeout (seconds)30
from signalwire import AgentBase

class ClaudeSkillsAgent(AgentBase):
    def __init__(self):
        super().__init__(name="claude-skills-agent")
        self.add_language("English", "en-US", "rime.spore")

        self.add_skill("claude_skills", {
            "skills_path": "/path/to/skills/directory",
            "tool_prefix": "skill_"
        })

Skills Summary Table

SkillFunctionsAPI RequiredMulti-Instance
datetime2NoNo
math1NoNo
web_search1YesYes
wikipedia_search1NoNo
weather_api1YesNo
joke1NoNo
play_background_file2NoNo
swml_transfer1NoYes
datasphere1YesYes
native_vector_search1NoYes
mcp_gatewayDynamicNo*Yes
google_maps2YesNo
info_gatherer2NoYes
claude_skillsDynamicNoYes
api_ninjas_trivia1YesYes
ask_claude1YesNo
custom_skillsDynamicNoNo
datasphere_serverless1YesYes
spider1NoYes

\* Requires MCP Gateway service, not external API

SignalWire Developer Documentation