GS

goldziher/spikard

开发工具
117 stars 0 forks 质量 45 趋势 45

Codegen-first polyglot web toolkit. A Rust core plus 14 language bindings generated by alef — spec-driven codegen (OpenAPI, AsyncAPI, GraphQL, JSON-RPC, gRPC, and SQL→HTTP), type-safe routing,...

概览

Codegen-first polyglot web toolkit. A Rust core plus 14 language bindings generated by alef — spec-driven codegen (OpenAPI, AsyncAPI, GraphQL, JSON-RPC, gRPC, and SQL→HTTP), type-safe routing,...

README

Install · Why spikard · Quick example · MCP server · Docs


[!IMPORTANT] spikard is experimental and pre-1.0. APIs change between releases, and not every binding is at the same level of maturity. It is not yet recommended for production.

That is also the invitation: this is the point where feedback actually shapes the design. If you try it and something is wrong, awkward, or missing, please open an issue. If you want to help, good first issues are scoped to be finishable in an evening, and CONTRIBUTING.md explains the generated-bindings workflow.

Why spikard

Capability Details
Type-safe across bindings HTTP routing with path, query, body, and header validation. Errors convert losslessly between languages.
Polyglot bindings Python, TypeScript/Node, Ruby, PHP, Elixir, Go, Java, C#, Kotlin, Dart, Swift, Zig, WASM, Rust, and C FFI.
Schema codegen Parse OpenAPI 3.0, AsyncAPI 3.0, GraphQL SDL, and JSON-RPC 2.0 specs. Generate handlers and validators per binding.
SQL to HTTP codegen Annotate SQL queries with @http GET /path, @http_auth bearer:jwt, and emit route metadata and OpenAPI specs.
Tower middleware Compression, rate limiting, timeouts, request IDs, JWT/API-key auth, and static file serving.
Lifecycle hooks onRequest, preValidation, preHandler, onResponse, and onError.
WebSocket & SSE Bidirectional streams and server-sent events.
Fixture-driven testing Shared JSON fixtures drive tests across language bindings for behavioral consistency.
CLI & MCP server Initialize projects, generate code, validate schemas, and integrate with MCP-compatible tools.

Installation

Each binding ships through its native package manager.

Target Package Install
Rust spikard on crates.io cargo add spikard
CLI spikard-cli on crates.io cargo install spikard-cli or cargo binstall spikard-cli
Python spikard on PyPI pip install spikard
Node.js @spikard/node on npm npm install @spikard/node
WASM @spikard/node-wasm on npm npm install @spikard/node-wasm
Ruby spikard on RubyGems gem install spikard
PHP goldziher/spikard on Packagist composer require goldziher/spikard
Elixir spikard on Hex Add {:spikard, "~> 0.17"} to mix.exs
Go github.com/Goldziher/spikard go get github.com/Goldziher/spikard
Java dev.spikard:spikard on Maven Central Maven/Gradle — see Java README
C# Spikard on NuGet dotnet add package Spikard
Kotlin dev.spikard:spikard on Maven Central Maven/Gradle — see Kotlin README
Dart spikard on pub.dev dart pub add spikard
Swift Spikard via SwiftPM Add to Package.swift
Zig spikard via build.zig.zon Add to build manifest
C FFI spikard-ffi shared/static library GitHub Releases

Quick example

Python

from spikard import Spikard
from msgspec import Struct

class User(Struct):
    id: int
    name: str

app = Spikard()

@app.get("/users/{id:int}")
async def get_user(id: int) -> User:
    return User(id=id, name="Alice")

if __name__ == "__main__":
    app.run(port=8000)

TypeScript

import { Spikard } from "@spikard/node";

const app = new Spikard();

app.get("/users/{id:int}", async (id: number) => {
  return { id, name: "Alice" };
});

app.run({ port: 8000 });

MCP server

The CLI ships an MCP server so a coding agent can scaffold and generate spikard projects directly. It is enabled by default (spikard-cli feature mcp) and speaks stdio out of the box; streamable HTTP is available via the mcp-http feature.

{
  "mcpServers": {
    "spikard": {
      "command": "spikard",
      "args": ["mcp"]
    }
  }
}

Thirteen tools are exposed, covering project init, codegen from every supported spec format, the SQL→HTTP pipeline, AsyncAPI fixture and test-app generation, schema validation, and a feature summary. See the MCP documentation for the full tool list and worked flows.

SQL to HTTP

Annotate a SQL query and spikard emits the route, an OpenAPI 3.1 fragment, and a typed handler stub that calls into the generated query function:

-- @name GetUser
-- @returns :one
-- @http GET /users/{id}
-- @http_auth bearer:jwt
SELECT id, name, email FROM users WHERE id = $1;

Query parsing and type inference come from scythe; spikard reads scythe’s analyzed-query IR and overlays the HTTP vocabulary on top. scythe stays library-agnostic and owns no HTTP concepts. See the SQL codegen guide.

Architecture

All bindings call a shared Rust core through thin language-native layers:

Development

task setup     # Install dependencies
task build     # Build Rust core (debug)
task test      # Run Rust tests
task test:all  # Run all tests (Rust + bindings)
task e2e:all   # Generate + build + run e2e tests
task format    # Format all code

Run task --list for the full task catalog.

License

MIT License — see LICENSE for details.

View this README on GitHub

安装

This server does not publish a one-line install command.

Open the repository installation guide

配置

{ "mcpServers": { "spikard": { "command": "spikard", "args": ["mcp"] } } }