Traul Message Search
dandaka/traul
Drives the traul CLI to sync, search and monitor messages from Slack, Telegram, Discord, Linear, Gmail, WhatsApp, Claude Code sessions and Markdown files.
Step-by-step guide for adding a new messaging platform integration to Agent Kernel.
$ npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-messaging-integration --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ak-dev-new-messaging-integration .claude/skills/ak-dev-new-messaging-integration && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ak-dev-new-messaging-integration" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-messaging-integration into .claude/skills/ak-dev-new-messaging-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-messaging-integration", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-messaging-integrationType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-messaging-integration --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/ak-dev-new-messaging-integration .agents/skills/ak-dev-new-messaging-integration && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ak-dev-new-messaging-integration" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-messaging-integration into .agents/skills/ak-dev-new-messaging-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-messaging-integration", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-messaging-integration --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/ak-dev-new-messaging-integration .cursor/skills/ak-dev-new-messaging-integration && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ak-dev-new-messaging-integration" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-messaging-integration into .cursor/skills/ak-dev-new-messaging-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-messaging-integration", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/yaalalabs/agent-kernel.git --path .agents/skills/ak-dev-new-messaging-integration--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-messaging-integration --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/ak-dev-new-messaging-integration .gemini/skills/ak-dev-new-messaging-integration && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ak-dev-new-messaging-integration" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-messaging-integration into .gemini/skills/ak-dev-new-messaging-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-messaging-integration", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-messaging-integrationInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/ak-dev-new-messaging-integration .github/skills/ak-dev-new-messaging-integration && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ak-dev-new-messaging-integration" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-messaging-integration into .github/skills/ak-dev-new-messaging-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-messaging-integration", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install yaalalabs/agent-kernel ak-dev-new-messaging-integration --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yaalalabs/agent-kernel.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/ak-dev-new-messaging-integration .opencode/skills/ak-dev-new-messaging-integration && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ak-dev-new-messaging-integration" agent skill from https://github.com/yaalalabs/agent-kernel/tree/develop/.agents/skills/ak-dev-new-messaging-integration into .opencode/skills/ak-dev-new-messaging-integration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ak-dev-new-messaging-integration", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ak-dev-new-messaging-integrationStep-by-step guide for adding a new messaging platform integration to Agent Kernel.
Ak Dev New Messaging Integration is an agent skill from yaalalabs/agent-kernel. Step-by-step guide for adding a new messaging platform integration to Agent Kernel. Use this skill when you need to add support for a new chat platform (beyond Slack, WhatsApp, Messenger, Instagram, Telegram, Teams, Gmail). Covers writing the inbound/outbound adapter pair, hosting it, webhook verification, attachments, configuration, and examples.
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Productivity & Automation, covering Messaging and chat bots, Email management and Webhooks. It works with Gmail, WhatsApp, Instagram and Slack. The repository describes itself as: The Operating System for Scalable Enterprise AI Agents - Run, orchestrate, and deploy Compliant Enterprise AI Agents at scale across frameworks, without lock-in, rewrites or… The licence is Apache-2.0.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 97fa8d9. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pipFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pip, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ak Dev New Messaging Integration loads about 4.6k tokens when it runs. Until then it costs about 96 tokens; SKILL.md has 1,345 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from yaalalabs/agent-kernel at commit 97fa8d9, republished under its Apache-2.0 licence (© yaalalabs). 1,345 words, ~4,619 tokens.
.claude/skills/ak-dev-new-messaging-integration/SKILL.md (or your agent's skills folder).This guide walks through adding a new messaging platform integration to Agent Kernel. Use the WhatsApp adapter (ak-py/src/agentkernel/integration/whatsapp/adapter.py) as the canonical webhook reference, and Gmail (integration/gmail/adapter.py) as the polling one.
A platform integration is two pure translation functions with a queue between them (spec #524):
InboundAdapter turns one platform delivery into normalized InboundRequest envelopes: it verifies the delivery, extracts the text, downloads and stores attachments, and resolves session_id and request_id at the edge. It never runs the agent.IntegrationProducer enqueues it, AgentRunner executes it platform-agnostically, and the reply travels back on the output queue with the integration attribute and the reply_-prefixed reply context.OutboundAdapter turns the agent's reply back into platform API calls, using nothing but the flat reply_context the inbound half resolved.This is why the webhook answers in milliseconds: a slow agent run can no longer hold the turn open past the platform's delivery timeout and cause a redelivery.
Hosting depends on how the platform delivers events:
| Source | Host | Entry point |
|---|---|---|
Source.WEBHOOK (pushed) | WebhookRESTRequestHandler | IOHandler.run(handlers=[WebhookRESTRequestHandler(MyInboundAdapter())]) |
Source.WEBHOOK on AWS Lambda | WebhookRESTRequestHandler via LambdaWebhookHost | host = LambdaWebhookHost(WebhookRESTRequestHandler(MyInboundAdapter())) at module scope in the request-handler Lambda, with Lambda.register(<webhook_path>, method="POST")(host.handle) (and GET → host.challenge when the adapter declares a challenge_path) (rest_sync/rest_async, sqs), with the route in gateway_endpoints and APIGatewayAuthorizer(bypass=WebhookRouteMatcher(...)) behind an authorizer |
Source.POLLER (pulled) | PollerRunner | IOHandler.run(pollers=[PollerRunner(MyInboundAdapter())]) on in_memory, PollerRunner.run(adapter) as its own container on a broker |
Adapters must be mounted inside the pipeline. WebhookRESTRequestHandler sets requires_pipeline = True, so RESTAPI.run([...]) refuses it with an AKConfigError: without a queue there would be no runner to drain what it enqueues, and the platform would get its 200 while the user never got a reply.
ak-py/src/agentkernel/integration/<platform>/
├── __init__.py
└── adapter.py# ak-py/src/agentkernel/integration/<platform>/adapter.py
import logging
from typing import Any, Dict, List, Optional
from fastapi import HTTPException, Request
from ...core.config import AKConfig
from ...core.model import AgentReply, AgentRequest, AgentRequestImage, AgentRequestText
from ...core.multimodal.storage import AttachmentStorageManager
from ..adapter.base import (
ATTACHMENTS_DISABLED_ERROR,
SESSION_CACHE_ERROR,
InboundAdapter,
InboundParseResult,
InboundRequest,
OutboundAdapter,
)
from ..adapter.routes import BUILTIN_WEBHOOK_ROUTES
NAME = "<platform>"
_log = logging.getLogger("ak.integration.<platform>")
class <Platform>InboundAdapter(InboundAdapter):
"""<Platform> deliveries -> normalized requests."""
name = NAME
# A built-in reads its paths from the route table (see step 7), so the Lambda authorizer's
# WebhookRouteMatcher lets exactly this route through; a bring-your-own adapter spells it out.
webhook_path = BUILTIN_WEBHOOK_ROUTES[NAME].webhook_path
challenge_path = BUILTIN_WEBHOOK_ROUTES[NAME].challenge_path # None unless the platform has a GET handshake
_log = _log
def __init__(self):
config = AKConfig.get()
self._agent = config.<platform>.agent or None
self._max_file_size = config.api.max_file_size
self._client = <Platform>Client() # your API wrapper
async def verify(self, raw: Request) -> None:
"""Reject a delivery that did not come from the platform. Runs before parse."""
if not self._client.verify(await raw.body(), raw.headers.get("x-platform-signature", "")):
raise HTTPException(status_code=403, detail="Invalid signature")
async def parse(self, raw: Request) -> InboundParseResult:
"""One delivery can carry several messages; return one InboundRequest per message."""
body = await raw.json()
requests = [r for r in [await self._to_request(m) for m in body.get("messages", [])] if r is not None]
return InboundParseResult(requests=requests)
async def _to_request(self, message: dict) -> Optional[InboundRequest]:
text = message.get("text", "")
sender = message["from"]
if not text:
return None # legitimately ignored: an empty list is not an error
requests: List[AgentRequest] = [AgentRequestText(prompt=text)]
# ... download attachments into `requests` here (see step 5) ...
requests, _ = AttachmentStorageManager.offload(
sender,
requests,
attachments_disabled_error=ATTACHMENTS_DISABLED_ERROR,
session_cache_error=SESSION_CACHE_ERROR,
)
return InboundRequest(
session_id=sender, # the platform's conversation key
request_id=message["id"], # the platform's own id: this is what dedupes a retry
requests=requests,
prompt=text,
agent=self._agent,
user_id=sender,
reply_context={"to": sender}, # flat, string-valued delivery coordinates
)Rules the adapter must hold to:
ChatService, AgentService or Runtime import. The only side effects allowed are platform API calls and attachment storage.AKConfig.get().<platform>.verify before parse, parse before enqueue. verify is concrete and a no-op on the base: override it only when verification is separable from parsing. (Slack and Teams verify inside their SDK's dispatch, so theirs stays the default.)request_id is the platform's message id wherever one exists; that is what makes a webhook retry deduplicate instead of running the agent twice. Synthesize a stable one only when the platform gives you none (Slack: f"slack:{channel}:{ts}").missing_verification_settings() when verify skips its check for an unset secret
(return e.g. ["<platform>.webhook_secret"] while it is empty). LambdaWebhookHost refuses such an
adapter on cold start, because behind the authorizer's integration bypass the adapter's own check is
the only one. An adapter that refuses to construct without its secret (Slack, Teams) needs no override.class <Platform>OutboundAdapter(OutboundAdapter):
"""Agent replies -> <Platform> messages."""
name = NAME
MESSAGE_LIMIT = 4096 # the platform's per-message limit; split_reply chunks to it
MAX_CHUNKS = None # or a cap, with TRUNCATION_NOTICE appended past it
_log = _log
def __init__(self):
self._client = <Platform>Client()
async def acknowledge(self, reply_context: Dict[str, str]) -> Dict[str, str]:
"""Edge-side feedback: a typing indicator, a read receipt, a "thinking" message.
The returned dict is merged into reply_context, which is how Slack carries the id of
its placeholder message through to delivery.
"""
await self._client.typing(reply_context["to"])
return {}
async def deliver(self, reply: AgentReply, reply_context: Dict[str, str]) -> None:
"""Raising hands the message back for retry, then deliver_error."""
await self._client.send(reply_context["to"], self.split_reply(str(reply)))
async def deliver_error(self, message: str, reply_context: Dict[str, str]) -> None:
try:
await self._client.send(reply_context["to"], [message])
except Exception as e:
self._log.error(f"Could not deliver the <Platform> error message: {e}")AgentReplyText: the Agent Runner serializes the typed reply to its string form before the output queue.self, and build loop-bound clients (an httpx.AsyncClient) per call.deliver_error receives OutboundAdapter.ERROR_MESSAGE, not the raw exception: raw error text is logged, never sent to a platform user.reply_context is flat, string-valued delivery coordinates: everything deliver needs and nothing else. It travels as reply_-prefixed message attributes rather than body fields, because BaseRunRequest is extra="allow" and an unknown body field would reach the agent as AgentRequestAny context.
Budget: 8 KB serialized, enforced in IntegrationProducer with a ValueError naming the adapter. If the platform's reply address is an object rather than strings, JSON-encode it into one value (Teams does this with its ConversationReference).
Attachment bytes must not ride the queue: brokers cap a message far below api.max_file_size. Download at the edge (that is where the platform token is), then call AttachmentStorageManager.offload, which stores the bytes in the AttachmentStore and replaces each image/file request with an AgentRequestAttachmentRef.
This makes multimodal.enabled: true a requirement for attachment-bearing messages, and rejects multimodal.storage_type: session_cache (it writes into a session copy the runner process never sees). Both messages are shared constants; pass them through as shown in step 2.
__init__.py and the Public Alias# ak-py/src/agentkernel/integration/<platform>/__init__.py
from .adapter import <Platform>InboundAdapter, <Platform>OutboundAdapterCreate ak-py/src/agentkernel/<platform>.py with a wildcard import (see ak-py/src/agentkernel/slack.py):
from .integration.<platform> import *The Response Handler holds only the integration attribute string, so the outbound half is resolved by name. Add the platform to IntegrationAdapterFactory (integration/adapter/factory.py): its short name in _BUILTIN_NAMES, and an if/elif branch in _builtin importing the class inside require_extra.
(The inbound half is never resolved by name: the application constructs it and hands it to a host, so bring-your-own inbound is just passing a different instance.)
Add the platform's routes to BUILTIN_WEBHOOK_ROUTES in integration/adapter/routes.py as well, a
WebhookRoute(name, webhook_path, challenge_path=...). It is the one definition the adapter's path
attributes and WebhookRouteMatcher.for_integrations(...) both read, and
IntegrationAdapterContract.test_a_builtin_is_served_where_the_authorizer_expects fails when they drift.
Add a config section to ak-py/src/agentkernel/core/config.py, following the existing idiom (Field with empty-string defaults). Every platform block carries an outbound_adapter override:
class _<Platform>Config(BaseModel):
agent: str = Field(default="", description="Agent name to handle <Platform> messages")
bot_token: str = Field(default="", description="<Platform> bot token")
webhook_secret: str = Field(default="", description="Webhook verification secret")
outbound_adapter: str = Field(
default="",
description="Dotted path to an OutboundAdapter subclass replacing the built-in <Platform> outbound adapter",
)
class AKConfig(YamlBaseSettingsModified):
<platform>: _<Platform>Config = Field(description="<Platform> related configurations", default_factory=_<Platform>Config)Configurable through config.yaml or AK_<PLATFORM>__AGENT / AK_<PLATFORM>__BOT_TOKEN environment variables.
In ak-py/pyproject.toml:
[project.optional-dependencies]
<platform> = [
"httpx>=0.27.0", # for HTTP API calls (most platforms need this)
"platform-sdk>=x.y.z", # platform-specific SDK if available
]The factory imports the built-in inside require_extra("<platform>", ...), so a missing SDK reports pip install "agentkernel[<platform>]" rather than a bare ModuleNotFoundError.
A platform with no webhook subclasses PollingInboundAdapter instead:
class <Platform>InboundAdapter(PollingInboundAdapter):
name = NAME
poll_interval = 30.0 # read it from your config block in __init__
async def poll(self) -> List[Any]:
"""Return the raw events to parse this iteration. Must not run the agent."""
def mark_handled(self, raw: Any) -> None:
"""Called after an event is enqueued, so the next poll skips it."""PollerRunner waits on ThreadRunner.shutdown_event between iterations, so a 30-second interval still drains promptly on SIGTERM. Run the poller at one replica: mark_handled state is per process (see Gmail, where a message stays unread until its reply is sent).
# server.py
from agentkernel.integration.adapter import WebhookRESTRequestHandler
from agentkernel.openai import OpenAIModule
from agentkernel.pipeline import IOHandler
from agentkernel.<platform> import <Platform>InboundAdapter
from agents import Agent
agent = Agent(name="general", instructions="You are a helpful assistant.")
OpenAIModule([agent])
if __name__ == "__main__":
IOHandler.run(handlers=[WebhookRESTRequestHandler(<Platform>InboundAdapter())])Create examples/api/<platform>/ with:
server.py — minimal working example (the pattern above)pyproject.toml — with agentkernel[api,openai,<platform>] dependencyconfig.yaml — platform configurationserver_test.py — health check and basic functional testREADME.md — setup instructions (bot token, webhook URL, etc.)Two files:
ak-py/tests/test_integration_adapter_contract.py — add a IntegrationAdapterContract subclass for the platform. The contract covers the invariants the queue hop needs: stable identifiers, an ignorable delivery that is not an error, a flat reply context inside its budget, and a clean round trip through IntegrationProducer.ak-py/tests/test_<platform>_integration.py — the platform's own parsing and formatting. Build the adapter via object.__new__ with a stubbed API client (see test_whatsapp_integration.py), and cover: message parsing, ignored deliveries, rejection paths (oversized, unsupported media, download failure), verification, reply chunking and acknowledgement.Add docs/docs/integrations/<platform>.md covering:
outbound_adapterIOHandler.run(handlers=[...])multimodal.enabled requirement if the platform accepts attachmentsThen update the landing page inventories in docs/src/components/*/data.tsx: add a tile to the Channels & protocols row in IntegrationsMarquee/data.tsx (role Channel, href to the new page, logo under docs/static/img/integrations/ or a react-icons/si glyph); add pick("<tile name>") to the Messaging channels card in ArchitectureOverview/data.tsx; add the platform to the Messaging Channels card's tags and description under the Connect tab in FeatureExplorer/data.tsx. Logo sourcing and the build check are in ak-dev-sync-docs-from-branch, Docs-Site Landing and Features Pages.
Then the features page: the MESSAGING_PLATFORMS list in docs/src/pages/features.tsx (logo, link to the new page). Grep docs/src/pages/*.tsx, README.md, and docs/docs/intro.md for the platform roll call ("Slack, WhatsApp, ...") and add the new name wherever the others are listed.
ak-py/src/agentkernel/integration/<platform>/adapter.py with the inbound/outbound pairverify (or a documented reason it stays the base no-op) and challenge if the platform has a handshakerequest_id set from the platform's own message idAttachmentStorageManager.offload, never inlinedreply_context flat, string-valued, inside the 8 KB budgetMESSAGE_LIMIT (and MAX_CHUNKS) set to the platform's limits__init__.py and public alias at ak-py/src/agentkernel/<platform>.pyIntegrationAdapterFactory._BUILTIN_NAMES and _builtinWebhookRoute in integration/adapter/routes.py::BUILTIN_WEBHOOK_ROUTES, with the adapter's paths read from itmissing_verification_settings() overridden if verify skips its check for an unset secretconfig.py, including outbound_adapterpyproject.tomlexamples/api/<platform>/ mounting through IOHandler.runIntegrationAdapterContract subclass plus the per-platform test filedocs/docs/integrations/<platform>.mdIntegrationsMarquee/data.tsx), pick() chip on the Messaging channels card (ArchitectureOverview/data.tsx), Messaging Channels card tags (FeatureExplorer/data.tsx)docs/src/pages/features.tsx (MESSAGING_PLATFORMS) and in the README/intro roll calls© yaalalabs, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/ak-dev-new-messaging-integration of yaalalabs/agent-kernel.
Open the folder on GitHubat commit 97fa8d9
Ak Dev New Messaging Integration next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ak Dev New Messaging Integration this skillyaalalabs/agent-kernel | 192 | — | ~4.6k | Automated safety check: Pass | Apache-2.0 | |
| Traul Message Searchdandaka/traul | 113 | — | ~3.9k | Automated safety check: Notes | AGPL-3.0 | |
| Integration WebhooksBuilderIO/agent-native | 7.1k | — | ~5.3k | Automated safety check: Pass | None | |
| Openloomi Connectorsmelandlabs/openloomi | 1k | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Messagingvellum-ai/vellum-assistant | 1.4k | — | ~4.1k | Automated safety check: Pass | MIT | |
| Ops Inboxdavepoon/buildwithclaude | 3.6k | — | ~7.2k | Automated safety check: Notes | MIT |
dandaka/traul
Drives the traul CLI to sync, search and monitor messages from Slack, Telegram, Discord, Linear, Gmail, WhatsApp, Claude Code sessions and Markdown files.
BuilderIO/agent-native
Cross-platform pattern for handling messaging integration webhooks (Slack, Telegram, WhatsApp, email, etc.) on serverless hosts.
melandlabs/openloomi
openloomi Connectors tools - manage the native 7 messaging integrations and pair with the composio skill for the 1000+ apps OAuth layer (Slack, Discord, X, Gmail, Outlook, Google…
vellum-ai/vellum-assistant
Read, search, send, and manage messages across Gmail, Outlook, Telegram, and other platforms
davepoon/buildwithclaude
Full inbox management across all channels — WhatsApp (wacli), Email (Gmail MCP), Slack (MCP), Telegram (user-auth MCP), Discord (webhook + REST read), Notion (MCP — comments, mentions, assigned…
databuddy-analytics/Databuddy
Build multi-platform chat bots with Chat SDK (chat npm package).
yaalalabs/agent-kernel
Code quality standards, formatting, Python style rules (classes over script-style functions, configuration-field rules), commit conventions, and PR workflow for Agent Kernel development.
yaalalabs/agent-kernel
Step-by-step guide for adding a new built-in test evaluator provider to Agent Kernel (beyond DeepEval, Opik and JEV).
yaalalabs/agent-kernel
Step-by-step guide for adding a new guardrail provider to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new knowledge base backend to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new multimodal attachment storage backend to Agent Kernel.
yaalalabs/agent-kernel
Step-by-step guide for adding a new queue transport to Agent Kernel's execution pipeline.
Categories
Step-by-step guide for adding a new messaging platform integration to Agent Kernel. Ak Dev New Messaging Integration is an agent skill from yaalalabs/agent-kernel. Step-by-step guide for adding a new messaging platform integration to Agent Kernel.
Ak Dev New Messaging Integration fits situations like: you need to add support for a new chat platform (beyond Slack; tasks that involve Messaging and chat bots; tasks that involve Email management.
Run `npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a claude-code`. Or copy the skill folder (.agents/skills/ak-dev-new-messaging-integration in yaalalabs/agent-kernel) into .claude/skills/ak-dev-new-messaging-integration in your project. Claude Code loads it when a task matches its description.
Run `npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a codex`. Or copy the skill folder (.agents/skills/ak-dev-new-messaging-integration in yaalalabs/agent-kernel) into .agents/skills/ak-dev-new-messaging-integration in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add yaalalabs/agent-kernel --skill ak-dev-new-messaging-integration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ak-dev-new-messaging-integration, .gemini/skills/ak-dev-new-messaging-integration, .github/skills/ak-dev-new-messaging-integration and .opencode/skills/ak-dev-new-messaging-integration in your project.
Going by SKILL.md and its folder, Ak Dev New Messaging Integration needs the command-line tools its instructions call (pip). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Ak Dev New Messaging Integration is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ak Dev New Messaging Integration: Traul Message Search (dandaka/traul, 113 stars), Integration Webhooks (BuilderIO/agent-native, 7.1k stars), Openloomi Connectors (melandlabs/openloomi, 1k stars) and Messaging (vellum-ai/vellum-assistant, 1.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
yaalalabs (a GitHub organization) maintains it in yaalalabs/agent-kernel, which has 192 GitHub stars. The repository holds 23 skills in this directory. The repository was last updated on October 9, 2026.
Source: yaalalabs/agent-kernel on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.