A
aimdb-dev/aimdb
Data ingestion layer for distributed systems: typed contracts, safe schema evolution and one place to see and manage every node. From microcontroller to cloud.
SECURITY.md ✓
View on GitHub ↗Link checked 2026-11-12 · HTTP 200 · opens the vendor's own site
We have neither an install command nor a public remote endpoint from this repository, so we do not print a config. A made-up one is worse than none. How each client wires MCP up →
- Star count
- 103 ★ · aimdb-dev/aimdb · read from the GitHub search API · (checked 2026-11-13 20:00:50)
- Source
- collected from the punkpeye/awesome-mcp-servers list · type: MCP server
- Harvest history
- first seen 2026-10-23 · last seen 2026-11-14 · seen 26× · listed by 23 sources
- Score
- score 2,300 · 103 ★ · 23 sources · mcp
FAQ (answers come from our records)
Who is it for?
We filed it under these tags: MCP 服务. The tags come from the entry itself, not a taxonomy we imposed.
Who maintains it?
repository
aimdb-dev/aimdb;first catalogued 2026-10-23;last seen 2026-11-14。There is no official certification or quality rating here — we record sources and dates only.Distributed by design. Data-driven by default.
以下摘录自该仓库的 README(片段) · 在 GitHub 读完整 README →
AimDB is the data ingestion layer for distributed systems: typed contracts, safe schema evolution and one place to see and manage every node. From microcontroller to cloud.
Live demo ·
Get started ·
Python, C++, TypeScript ·
Discussions
## The problem
Every distributed system has an ingestion layer and it is usually the most fragile part.
Formats drift. A firmware team renames a field and the dashboard goes quiet three days later.
Fleets never update at once. Devices in the field run last year's firmware next to this week's release.
Nobody has the full picture. Which device sends what, in which version, over which link, lives in people's heads and old wiki pages.
AimDB makes that layer explicit, typed and versioned.
## How AimDB solves it
| | What you get | Built on |
| Stable | Every record has a typed contract. Producers and consumers can't disagree about the shape of the data. | SchemaType, compile-time checks |
| Evolvable | Old and new nodes run side by side. The hub upgrades v1 payloads to v2 on arrival and can downgrade for older peers. | migrationchain!, works nostd |
| Centrally managed | One shared contracts crate defines every record, key and link. The same CLI or AI client inspects and manages any node, from the cloud hub to an MCU on a serial port. | RecordKey, aimdb CLI, MCP server |
> See it running: live weather stations streaming typed contracts across MCU, edge and cloud.
## See it in three steps
### 1. Define the fleet's contracts once
One nostd crate holds every contract and record key. Stations, hub and dashboard all compile against it, so they can't disagree.
rust,ignore
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TemperatureV2 {
pub schemaversion: u32,
pub celsius: f32,
pub timestamp: u64,
impl SchemaType for TemperatureV2 {
const NAME: &'static str = "temperature";
const VERSION: u32 = 2;
#[derive(RecordKey, Clone, Copy, PartialEq, Eq, Debug)]
#[keyprefix = "temp."]
pub enum TempKey {
#[key = "alpha"]
#[linkaddress = "mqtt://sensors/alpha/temperature"]
Alpha,
#[key = "beta"]
#[linkaddress = "mqtt://sensors/beta/temperature"]
Beta,
### 2. Evolve a contract without a flag day
v1 stations sent temp plus a unit. v2 sends celsius. Write the step once:
rust,ignore
impl MigrationStep for TemperatureV1ToV2 {
type Older = TemperatureV1;
type Newer = TemperatureV2;
const FROMVERSION: u32 = 1;
const TOVERSION: u32 = 2;
fn up(v1: TemperatureV1) -> Result {
let celsius = match v1.unit.asstr() {
"F" => (v1.temp - 32.0) 5.0 / 9.0,
"K" => v1.temp - 273.15,
=> v1.temp,
};
Ok(TemperatureV2 { schemaversion: 2, celsius, timestamp: v1.timestamp })
fn down(v2: TemperatureV2) -> Result {
Ok(TemperatureV1::new(v2.celsius, v2.timestamp, "C"))
migrationchain! {
type Current = TemperatureV2;
versionfield = "schemaversion";
steps { TemperatureV1ToV2: TemperatureV1 => TemperatureV2 }
The chain is validated at compile time and runs on a microcontroller too. Full example: weather-mesh-common.
### 3. Manage every node from one place
The same aimdb CLI talks to the hub over TCP and to a microcontroller over a serial port:
bash
aimdb --connect tcp://hub.local:7001 record list # every record, with live values
aimdb --connect tcp://hub.local:7001 graph dot | dot -Tsvg > fleet.svg
Live demo ·
Get started ·
Python, C++, TypeScript ·
Discussions
## The problem
Every distributed system has an ingestion layer and it is usually the most fragile part.
Formats drift. A firmware team renames a field and the dashboard goes quiet three days later.
Fleets never update at once. Devices in the field run last year's firmware next to this week's release.
Nobody has the full picture. Which device sends what, in which version, over which link, lives in people's heads and old wiki pages.
AimDB makes that layer explicit, typed and versioned.
## How AimDB solves it
| | What you get | Built on |
| Stable | Every record has a typed contract. Producers and consumers can't disagree about the shape of the data. | SchemaType, compile-time checks |
| Evolvable | Old and new nodes run side by side. The hub upgrades v1 payloads to v2 on arrival and can downgrade for older peers. | migrationchain!, works nostd |
| Centrally managed | One shared contracts crate defines every record, key and link. The same CLI or AI client inspects and manages any node, from the cloud hub to an MCU on a serial port. | RecordKey, aimdb CLI, MCP server |
> See it running: live weather stations streaming typed contracts across MCU, edge and cloud.
## See it in three steps
### 1. Define the fleet's contracts once
One nostd crate holds every contract and record key. Stations, hub and dashboard all compile against it, so they can't disagree.
rust,ignore
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TemperatureV2 {
pub schemaversion: u32,
pub celsius: f32,
pub timestamp: u64,
impl SchemaType for TemperatureV2 {
const NAME: &'static str = "temperature";
const VERSION: u32 = 2;
#[derive(RecordKey, Clone, Copy, PartialEq, Eq, Debug)]
#[keyprefix = "temp."]
pub enum TempKey {
#[key = "alpha"]
#[linkaddress = "mqtt://sensors/alpha/temperature"]
Alpha,
#[key = "beta"]
#[linkaddress = "mqtt://sensors/beta/temperature"]
Beta,
### 2. Evolve a contract without a flag day
v1 stations sent temp plus a unit. v2 sends celsius. Write the step once:
rust,ignore
impl MigrationStep for TemperatureV1ToV2 {
type Older = TemperatureV1;
type Newer = TemperatureV2;
const FROMVERSION: u32 = 1;
const TOVERSION: u32 = 2;
fn up(v1: TemperatureV1) -> Result {
let celsius = match v1.unit.asstr() {
"F" => (v1.temp - 32.0) 5.0 / 9.0,
"K" => v1.temp - 273.15,
=> v1.temp,
};
Ok(TemperatureV2 { schemaversion: 2, celsius, timestamp: v1.timestamp })
fn down(v2: TemperatureV2) -> Result {
Ok(TemperatureV1::new(v2.celsius, v2.timestamp, "C"))
migrationchain! {
type Current = TemperatureV2;
versionfield = "schemaversion";
steps { TemperatureV1ToV2: TemperatureV1 => TemperatureV2 }
The chain is validated at compile time and runs on a microcontroller too. Full example: weather-mesh-common.
### 3. Manage every node from one place
The same aimdb CLI talks to the hub over TCP and to a microcontroller over a serial port:
bash
aimdb --connect tcp://hub.local:7001 record list # every record, with live values
aimdb --connect tcp://hub.local:7001 graph dot | dot -Tsvg > fleet.svg
Listed badge (optional)
Copy this line into the README if you want the listing mark. Optional, and it does not affect being listed.
[](https://anclum.com/en/s/aimdb-dev-aimdb-tree-main-tools-aimdb-mcp/)
- Source
- awesome · https://github.com/aimdb-dev/aimdb/tree/main/tools/aimdb-mcp
- Browse by field
- MCP servers
- Traction
- 103 ★ (parent repository total, not this entry's)
- Listed by
- 23 independent sources
- added
- today
- Security policy
- the repository has
SECURITY.mdat its root (we checked that the file exists, not what it says)
More like this
Filed under
Every tag opens the full list for that filter. Counts are the live catalogue figures.