返回 MCP 目录
public公开dns本地运行

Fonoster开源替代品

Fonoster 是一个开源的电信堆栈,旨在为企业提供可编程的云电话服务,作为 Twilio 的替代品。其核心功能包括多租户支持、PBX 功能部署、可编程语音应用、NodeJS SDK、Amazon S3 集成、API 安全保护(Let's Encrypt、OAuth2、JWT)、基于角色的访问控制(RBAC)、插件式命令行工具以及 Google Speech API 支持。Fonoster 提供了丰富的 API 和 SDK,开发者可以轻松构建语音应用,控制通话流程,并集成到现有系统中。它支持 Docker 部署,适合需要灵活、可扩展的电信解决方案的企业。

article

README

Fonoster: The open-source alternative to Twilio

Fonoster is researching an innovative Programmable Telecommunications Stack that will allow businesses to connect telephony services with the Internet entirely through a cloud-based utility.

Fonoster community banner

build release Discord Code Of Conduct GitHub Twitter Follow

Features

The most notable features of Fonoster are:

  • [x] Multitenancy
  • [x] Easy deployment of PBX functionalities
  • [x] Programmable Voice Applications
  • [x] NodeJS SDK
  • [x] Support for Amazon Simple Storage Service (S3)
  • [x] Secure API endpoints with Let's Encrypt
  • [x] Authentication with OAuth2
  • [X] Authentication with JWT
  • [x] Role-Based Access Control (RBAC)
  • [x] Plugins-based Command-line Tool
  • [x] Support for Google Speech APIs

Code Examples

A Voice Application is a server that controls a call's flow. A Voice Application can use any combination of the following verbs:

  • Answer - Accepts an incoming call
  • Hangup - Closes the call
  • Play: Takes a URL with a media file and streams the sound back to the calling party
  • PlayDtmf - Takes a DTMF sequence and plays it back to the calling party
  • Say - Takes a text, synthesizes the text into audio, and streams back the result
  • Gather - Waits for DTMF or speech events and returns back the result
  • SGather - Returns a stream for future DTMF and speech results
  • Stream - Creates a bidirectional stream to send and receive audio from a caller
  • Dial - Passes the call to an Agent or a Number at the PSTN
  • Record - It records the voice of the calling party and saves the audio on the Storage sub-system
  • Mute - It tells the channel to stop sending media, effectively muting the channel
  • Unmute - It tells the channel to allow media flow

Voice Application Example:

const VoiceServer = require("@fonoster/voice").default;
const { 
  GatherSource, 
  VoiceRequest, 
  VoiceResponse 
} = require("@fonoster/voice");

new VoiceServer().listen(async (req: VoiceRequest, voice: VoiceResponse) => {
  const { ingressNumber, sessionRef, appRef } = req;

  await voice.answer();

  await voice.say("Hi there! What's your name?");

  const { speech: name } = await res.gather({
    source: GatherSource.SPEECH
  });

  await voice.say("Nice to meet you " + name + "!");

  await voice.say("Please enter your 4 digit pin.");

  const { digits } = await voice.gather({
    maxDigits: 4,
    finishOnKey: "#"
  });

  await voice.say("Your pin is " + digits);

  await voice.hangup();
});

// Your app will live at tcp://127.0.0.1:50061 
// and you can easily publish it to the Internet with:
// ngrok tcp 50061

Everything in Fonoster is an API first, and initiating a call is no exception. You can use the SDK to start a call with a few lines of code.

Example of originating a call with the SDK:

const SDK = require("@fonoster/sdk");

async function main(request) {
  const apiKey = "your-api-key";
  const apiSecret = "your-api-secret"
  const accessKeyId = "WO00000000000000000000000000000000";

  const client = new SDK.Client({ accessKeyId });
  await client.loginWithApiKey(apiKey, apiSecret);

  const calls = new SDK.Calls(client);
  const response = await calls.createCall(request);

  console.log(response); // successful response
}

const request = {
  from: "+18287854037",
  to: "+17853178070",
  appRef: "3e61ecb7-a1b6-4a93-84c3-4f1979165bca",
  // Optional metadata to be sent to the Voice Application
  metadata: {
    name: "John Doe",
    message: "Please call me back."
  }
};

main(request).catch(console.error);

Getting Started

To get started with Fonoster, use the following resources:

Give a Star! ⭐

Please give it a star if you like this project or plan to use it. Thanks 🙏

Bugs and Feedback

For bugs, questions, and discussions, please use the Github Issues

Contributing

For contributing, please see the following links:

Pedro
Pedro Sanders
Efrain
Efrain Peralta
Angel
Angel M. Bencosme
Wandy
Wandy Hernandez
Obruche
Obruche Wilfred Oghenechohwo
Wardner
Wardner Lara
Richard
Richard HC
Nageswari/
Nageswari
Hoan
Hoan Luu Huu
Speedy
Speedy Monster
harry_dev/
harry_dev
Kanishka
Kanishka Chowdhury
Brayan
Brayan Munoz V.
Dede
Dede kurniawan
gabriel
gabriel duncan
Prasurjya
Prasurjya Pran Borah
Jordan/
Jordan
Hector
Hector Ventura
0xflotus/
0xflotus
Manish/
Manish
Osama
Osama Sehgol
Paul
Paul Sütterlin
Riad
Riad Vargas
Shailendra
Shailendra Paliwal
The
The Gitter Badger
Yuri/
Yuri
cdrsociate/
cdrsociate
pavan/
pavan
nrjchnd/
nrjchnd
Salami
Salami Bashir
Shivam
Shivam Deepak Chaudhary
Yossef
Yossef Haim
telenautical/
telenautical
Wisdom
Wisdom Elendu
Judge
Judge Godwins
Jon
Jon Chin
Harish
Harish Chander
Gary
Gary Barnes
Fidal
Fidal Mathew
Enmanuel
Enmanuel Toribio
Dung
Dung Duc Huynh (Kaka)
Ciprian/
Ciprian
Christopher
Christopher Adigun
Bruno
Bruno Gomes
Bruno
Bruno Arueira
Antonius
Antonius Ostermann
Ali
Ali Firat ARI
Alex/
Alex
Albert
Albert E. Hidalgo Taveras

Sponsors

We're glad to be supported by respected companies and individuals from several industries.

Find all our supporters here

Become a Github Sponsor

Authors

License

Copyright (C) 2025 by Fonoster Inc. MIT License (see LICENSE for details).

help

运行方式说明

cloud

托管运行

托管运行通常表示这个 MCP Server 由服务方环境承载,用户一般按页面提供的连接方式或授权流程接入,不需要在本地长期启动一个 MCP 进程

  1. 打开服务方连接页
  2. 完成授权或复制端点
  3. 在 MCP 客户端中连接
terminal

本地运行 / 其它方式

本地运行通常需要用户在自己的电脑或服务器上安装依赖,把 server_config 复制到 MCP 客户端,并按 env_schema 补齐环境变量、密钥或其它配置

  1. 复制 server_config
  2. 安装所需依赖
  3. 补齐环境变量后重启客户端