npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

taias

v0.1.0

Published

Taias - Give your MCP server an opinion, guide your users to achieve outcomes

Downloads

113

Readme

www.taias.xyz

npm version License

Taias is a lightweight framework that helps MCP server builders influence and shape user experiences inside LLM-driven interfaces.

Installation

npm install taias

Quick Start

1. Define a flow — Map out your tool sequence:

import { defineFlow, createTaias } from "taias";

const flow = defineFlow("onboard", (flow) => {
  flow.step("scan_repo", () => ({ nextTool: "configure_app" }));
  flow.step("configure_app", () => ({ nextTool: "deploy" }));
});

2. Create a Taias instance:

const taias = createTaias({ 
  flow,
  devMode: true, // Enable validation and warnings during development
  onMissingStep: ({ toolName }) => {
    console.warn(`[Taias] No step defined for tool "${toolName}"`);
  },
});

3. Append advice to your tool response:

// Inside your tool handler

const affordances = await taias.resolve({ toolName: "scan_repo" });

let message = "Scan successful!";

// Append Taias advice to guide the LLM to the next step
if (affordances?.advice) {
  message += `\n\n${affordances.advice}`;
}

return {
  content: [
    {
      type: "text",
      text: message,
    },
  ],
};

API

defineFlow(flowId, builder)

Creates a flow definition.

const myFlow = defineFlow("my_flow", (flow) => {
  flow.step("tool_name", (ctx) => ({
    nextTool: "next_tool_name",
  }));
});

Parameters:

  • flowId - Unique identifier for the flow
  • builder - Callback receiving a FlowBuilder to define steps

Returns: FlowDefinition

createTaias(options)

Creates a Taias instance from a flow.

const taias = createTaias({
  flow: myFlow,
  devMode: true,
  onMissingStep: (ctx) => {
    console.log(`No next step for tool: ${ctx.toolName}`);
  },
});

Options:

  • flow - A FlowDefinition created by defineFlow
  • devMode (optional) - Enable development mode checks
  • onMissingStep (optional) - Callback invoked when no step matches

Returns: Taias instance

taias.resolve(ctx)

Resolves a tool call to get the suggested next step. Advice text to send the LLM is generated based on the nextTool specified in your step handler.

const affordances = await taias.resolve({ toolName: "scan_repo" });
// affordances.advice → "FOR THE BEST USER EXPERIENCE, TELL THE USER TO USE THE configure_app TOOL NEXT!!!!!"

The emphasis helps LLMs prioritize it.

Parameters:

  • ctx.toolName - The name of the tool being called

Returns: Affordances | null

  • Returns { advice: string } with auto-generated advice if a matching step is found
  • Returns null if no step matches or handler returns null

Types

type TaiasContext = {
  toolName: string;
};

type StepDecision = {
  nextTool: string;
};

type Affordances = {
  advice: string;
};

type StepHandler = (
  ctx: TaiasContext
) => StepDecision | null | Promise<StepDecision | null>;

type FlowStep = {
  toolName: string;
  handler: StepHandler;
};

type FlowDefinition = {
  id: string;
  steps: Array<FlowStep>;
};

interface FlowBuilder {
  step(toolName: string, handler: StepHandler): void;
}

type TaiasOptions = {
  flow: FlowDefinition;
  devMode?: boolean;
  onMissingStep?: (ctx: TaiasContext) => void;
};

interface Taias {
  resolve(ctx: TaiasContext): Affordances | null | Promise<Affordances | null>;
}

See the full documentation for more details.

Dev Mode

When devMode: true, Taias performs additional validation:

  1. Duplicate toolName detection — Throws an error if a flow defines the same tool name twice:

    Taias: Duplicate step for tool 'scan_repo' in flow 'onboard_repo'. V1 supports one handler per tool.
  2. Empty nextTool warning — Logs a warning if a handler returns empty nextTool:

    Taias: nextTool for tool 'scan_repo' is empty.

See the full documentation for more details.

Documentation

Full Documentation

License

Apache License 2.0