Message Send logo

Message Send

Organization
runxhq
message-send

Send one digest-bound message on behalf of a principal, posting to a channel or replying in a bound conversation through a compatible connector, after exact approval and independent provider readback.

Overview

Publisherrunxhq
Repositoryrunx
Skill namemessage-send
Stars
105
Forks
109
Bundled files
7
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 7 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by runxhq on GitHub. Read the source before you install it.

Installation

Install the Message Send AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/runxhq/runx/tree/main/skills/message-send
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/runxhq/runx.git /tmp/runx
mkdir -p .claude/skills
cp -r /tmp/runx/skills/message-send .claude/skills/message-send
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Message Send in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Message Send on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Message Send is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Message Send

Govern a message sent on behalf of a principal: a channel post or a reply in a bound conversation. The skill never receives a provider token, never lets approved content drift before delivery, and calls a message delivered only after the provider reads it back.

Composes

  • slack#read_thread

Runners

  • send (default): plans one channel post, requests approval only at the live post, posts once, and requires independent readback.
  • plan: the provider-neutral authorization step. It binds the principal, audience, content digest, consent basis, preflight checks and approval gate into a runx/message-send.plan.v1 packet, and never delivers.
  • plan_post: validates a channel name, channel id, or exact slack://workspace/channel destination, computes the message digest with Runx's native data.digest, and binds that digest, the named principal and the send intent through plan. It does not post and needs no approval.
  • plan_post_exact: for an operator that has already selected one exact destination, principal and text under its own policy. It reuses the same validation and digest and emits the same undelivered runx/message-send.notification_plan.v1 plan without a second model judgment. Its send_plan.origin is message-send.exact, not a claim that plan ran.
  • post: accepts only an exact notify_plan, the matching destination and text, and a stable UUID idempotency key. It recomputes the digest, compares the complete binding, stops unless exact native approval or a matching standing notification authority is present, runs channel.post through the configured binding, then reads the returned message locator back with channel.post.read and seals only the bounded evidence fields.
  • reconcile_post: reads back a post whose delivery outcome was ambiguous, without posting again.
  • reply: delivers one admitted reply to a bound conversation. The operator supplies the exact source packet, thread, draft, provider and native turn identity. The skill holds unless the source proves complete coverage, then asks for exact approval, runs thread.reply on the chosen connector, and requires thread.reply.read to resolve a stable message locator with the matching content digest. An accepted or queued request alone leaves the work held for reconciliation.

A channel post and a source-bound reply keep their own input checks: a post is bound to a destination and a plan, a reply to a source packet and a turn.

The binding may be local, self-hosted, third-party or Runx-hosted. The skill never receives a token, constructs a raw HTTP request, owns a tenant, or stores connector credentials in its inputs or receipts.

When to use this skill

  • An agent needs to post one bounded message, or reply in one conversation, on behalf of a user, team, brand, account or service.
  • An operator explicitly wants an authorization plan and selects plan.
  • The workflow must prove the intended audience, content, consent basis and approval decision before delivery.

When not to use this skill

  • To write copy only. Use a drafting or brand-voice skill unless delivery is in scope.
  • To claim delivery from a plan; only provider readback is terminal evidence.
  • To send without a named principal and audience.
  • To bypass unsubscribe, consent, suppression, preflight, legal or human approval gates.

Procedure for plan

  1. Identify the principal being represented and the provider account or surface.
  2. Classify the send: transactional, campaign, flow_step, support_reply, outreach, status, or internal.
  3. Bind channel and audience. Audience must be a named recipient, list, segment, support thread, channel, or scoped all-contacts decision; never an implicit broad default.
  4. Bind content by digest or stable draft reference. Do not approve mutable content by prose summary alone.
  5. Check consent, unsubscribe, suppression, compliance, preflight, and provider readiness. Missing evidence becomes a blocker.
  6. Decide the gate:
    • drafts, previews, and test sends may proceed without live-delivery approval when provider policy permits them;
    • customer, public, audience, or live sends require explicit approval;
    • billing/account mutation is outside this skill and needs its own gate.
  7. Produce the smallest provider-neutral send_plan that execution can consume without widening authority.
  8. Return needs_input for missing principal, audience, content digest, consent basis, or provider readiness; return refused for gate bypass.

Edge cases and stop conditions

  • No principal: return needs_input; the agent cannot speak as an unnamed actor.
  • No audience: return needs_input; do not default to all contacts or a whole channel.
  • All contacts or broad audience: require explicit reconfirmation and a stricter preflight block.
  • Mutable content: return needs_input until content is digest-bound.
  • Missing consent or unsubscribe path: block live delivery.
  • Plan, destination, content-digest, principal or audience drift: stop.
  • Approval denied or absent: do not deliver.
  • Missing, ambiguous, wrong-provider or insufficient-scope binding: refuse rather than fall back to a raw token.
  • Ambiguous mutation outcome: resume with the same idempotency key, or reconcile; never create a new key to escape uncertainty. Changed content never inherits the old approval.
  • Raw credentials or contact dumps: redact; if redaction would remove the evidence needed to decide, return needs_input.

Outputs

  • send_plan is the runx/message-send.plan.v1 packet: the decision (ready, needs_input, denied or refused), the principal, provider, send class, channel, audience, digest-bound content, the gates the send needs, blockers, provider actions, evidence locators and the success checkpoint.
  • notify_plan is the runx/message-send.notification_plan.v1 packet, the exact post post and reconcile_post deliver.
  • A reply ends in a runx.work_outcome.v1 packet for its host.

A post is delivered only when the sealed runx.provider.operation.v1 packet identifies the operation and carries the provider-returned message locator, conversation locator, content digest and occurrence time, and the follow-up readback resolves that exact locator.

Worked example

An operator plans "release 2.4 is verified" for one internal channel. Approval binds that exact text and destination. If the text changes to include another claim, post refuses the digest mismatch. With a matching plan and one valid Slack binding, the provider posts and returns the message id; the follow-up readback resolves that id, and those provider observations, not the local plan, prove delivery.

Inputs

  • send: channel_locator, text, principal, idempotency_key, and optional provider_context.
  • plan: objective and principal, with optional provider_context, audience, content, consent_basis, operator_context and connector.
  • post: the notify_plan, the identical locator and text, and a stable idempotency key.
  • reply: source_context, turn_id, expected_provider, thread_locator and draft_message.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Message Send AI skill do?

Send one digest-bound message on behalf of a principal, posting to a channel or replying in a bound conversation through a compatible connector, after exact approval and independent provider readback.

Why use Message Send on TypingMind?

Because you install it once and use it with any model. Message Send is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Message Send in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/runxhq/runx/tree/main/skills/message-send. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Message Send?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Message Send?

As many as you like. As long as a model supports skills, you can use Message Send with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Message Send AI skill free?

Yes. It is published on GitHub by runxhq under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇