Followin MCP
Followin-MCP
Resumen del proyecto
Este proyecto puede entenderse como un prototipo de recomendación a nivel de eventos orientado al escenario de noticias cripto:
El flujo ascendente obtiene el contenido original a través de
Followin API + adapters.pynormalizer.pyestandariza el contenido original en unContentItemestructuradoservice.py, enget_personal_feed, realiza primero una recuperación múltiple explícita y luego un suplemento semánticoclustering.pyagrupa múltiples contenidos en unEventClusterdel mismo eventoranking.pyutiliza un ranker heurístico de múltiples señales + re-ranking MMR para generar un feed personalizado
Resumen en una frase:
Un prototipo de MCP de Followin para el escenario de noticias cripto: estandariza el contenido original en ítems estructurados y, mediante recuperación múltiple, suplemento semántico, agrupación de eventos y clasificación personalizada, genera un feed a nivel de evento para el usuario.
Related MCP server: Daily News MCP Server
Estructura del directorio
followin_mcp/Entrada del paquete Pythonfollowin_mcp/core/Lógica de negocio central: adaptador, modelo, normalizador, ranking, serviciofollowin_mcp/mcp/Entrada del servidor MCPfollowin_mcp/demo/Agente de prueba y demo webscripts/start_dev.shScript de inicio local con un solo clicweb/Recursos estáticos del frontend
Módulos principales
followin_mcp/core/adapters.pyCapa de adaptación de la API de Followinfollowin_mcp/core/models.pyModelos de datosfollowin_mcp/core/taxonomy_rules.pyConfiguración de taxonomía / reglasfollowin_mcp/core/normalizer.pyEstandarización de contenido original, extracción de entidades, identificación de tipos de eventosfollowin_mcp/core/clustering.pyAgrupación de eventosfollowin_mcp/core/ranking.pyClasificación y explicación de recomendaciones de usuariofollowin_mcp/core/semantic_recall.pyIndexación de embeddings, recuperación semántica, similitud de ítemsfollowin_mcp/core/service.pyEntrada de servicio orientada a MCP / capa de aplicación
Secuencia de procesamiento de solicitudes
sequenceDiagram
participant U as MCP client / agent
participant M as mcp/server.py
participant S as service.py
participant A as adapters.py
participant F as Followin API
participant N as normalizer.py
participant SR as semantic_recall.py
participant C as clustering.py
participant R as ranking.py
U->>M: call tool
M->>S: get_latest / search / get_personal_feed ...
S->>A: fetch raw content
A->>F: HTTP request
F-->>A: raw payload
A-->>S: raw items
loop per raw item
S->>N: normalize(raw)
N-->>S: ContentItem\nentities / event_type / scores
end
S->>SR: enqueue normalized items
SR-->>S: background indexing
opt personal feed / semantic supplement
S->>SR: recall(query, candidate pool)
SR-->>S: semantic candidates / similarity
end
opt personal feed
S->>C: cluster_same_event(items)
Note over C: uses item embedding similarity
C-->>S: EventCluster list
S->>R: rank_for_user(user, clusters)
Note over R: uses semantic_match_score
R-->>S: ranked clusters
end
S-->>M: tool payload
M-->>U: MCP responseCadena de procesamiento
1. Entrada MCP
mcp/server.pyExpone 7 herramientas MCP
Convierte los parámetros de entrada de MCP en llamadas a
service.pyResponsable de serializar
ContentItem / EventClusteren la estructura de retorno de MCP
2. Obtención de contenido original
service.py -> adapters.pyget_latest_headlines / get_project_feed / get_project_opinions / get_trending_topicsTransmite directamente la capacidad de paginación ascendenteget_trending_feeds / search_contentDevuelve directamente el resultado de la instantánea actualget_personal_feedRealiza primero la recuperación múltiple explícita y el suplemento semántico, luego pasa por la agrupación de eventos y la clasificación personalizada
3. Estandarización de contenido
normalizer.pynormalize(raw)convierte un ítem de contenido original en unContentItemFuentes de extracción de entidades:
etiqueta (tag)
palabra clave de cadena (chain keyword)
alias de proyecto
alias de token
alias de tema
alias dinámico (descubrimiento de entidades ligero / NER de derivación)
Resultados:
projects / tokens / chains / topicsentity_sourcesentity_confidence(fuerza del método de acierto)event_typecredibility_score(nivel de credibilidad de la fuente)importance_score(calculado mediante reglas predefinidas)
4. Recuperación (Recall)
La "recuperación" aquí se refiere a:
Tomar primero un lote de
ContentItemcandidatos de un grupo de contenido más grandePara su uso en la agrupación, clasificación y paginación posteriores
service.pyen el feed personal realiza primero una recuperación múltiple explícita:latesttrendingprojectsearch
Los resultados de la recuperación múltiple se desduplican primero por
item.idSi el mismo ítem es alcanzado por múltiples vías, se prioriza la versión con una coincidencia semántica más fuerte, mayor importancia y fecha de actualización más reciente
5. Agrupación de eventos
clustering.pyLa entrada es una lista de
ContentItemLa salida es una lista de
EventClusterEl objetivo de la agrupación es el "mismo evento", no el mismo proyecto o el mismo tema
Señales principales:
Compatibilidad de tipo de evento
Ventana de tiempo
Superposición de entidades con pesos de confianza
Similitud de títulos
Similitud semántica opcional
6. Clasificación personalizada
ranking.pyLa entrada es
EventClusterLa salida es el feed de clústeres clasificado según el usuario
Señales principales:
importance_scorefreshness_scorefollow_affinity_scoreinterest_match_scoresemantic_match_scoresource_quality_scorerisk_boost_score
mute_penaltyFinalmente, se realiza una capa de re-ranking de diversificación estilo MMR
7. Embedding
semantic_recall.pyEl ítem normalizado se encola (
enqueue) primero en un trabajador de embedding asíncronoEl embedding del ítem se almacena en la base de datos SQLite local
semantic_index.db
El embedding participa actualmente en tres cosas principales:
service.pyrealiza una recuperación semántica / suplemento semántico consciente de la consulta en el feed personal basado en la consulta actual y el grupo de candidatosclustering.pyutiliza la similitud de embedding del ítem como una de las señales de agrupaciónranking.pyintroduce la señal de coincidencia semántica en la clasificación final a través desemantic_match_score
Feed Personal
get_personal_feedes actualmente la única herramienta de feed con sesiónEl flujo principal es:
Recuperación múltiple explícita
Suplemento semántico
Agrupación de eventos
Clasificación personalizada
service.pymantiene internamenteFeedSessionState, que guarda principalmente:pending_clustersdelivered_event_idsdelivered_item_idssource_cursors
Los resultados devueltos incluyen:
ranked_clustersitemsde soporte desplegadosnext_cursorhas_more
La semántica de paginación es:
La primera solicitud crea una sesión de feed e intenta llenar los clústeres ya clasificados en
pending_clustersLa página actual toma los primeros
max_itemsclústeres del encabezado depending_clustersLos clústeres / ítems devueltos se registran en el conjunto de entregados para evitar repeticiones posteriores
El "más" posterior prioriza continuar consumiendo los
pending_clustersrestantesCuando el búfer cae por debajo del umbral de recarga, se activa la siguiente ronda de recuperación, suplemento semántico, agrupación y clasificación para rellenar el búfer
Semántica de herramientas y límites de contexto
Este conjunto actual de herramientas MCP se puede dividir en dos categorías:
Herramientas de consulta de contenido
get_latest_headlinesget_trending_feedsget_project_feedget_project_opinionsget_trending_topicssearch_content
Herramientas de recomendación
get_personal_feed
Las herramientas de consulta de contenido son por defecto sin estado:
get_latest_headlines / get_project_feed / get_project_opinions / get_trending_topicsTransmiten la capacidad de paginación ascendente
Devuelven una página de resultados correspondiente a la solicitud actual
get_trending_feeds / search_contentDevuelven directamente el resultado de la instantánea actual
No mantienen un estado de paginación adicional en la capa de servicio
get_personal_feed es actualmente la única herramienta con estado:
service.pymantendrá unFeedSessionStatede ciclo de vida cortoSolo expone externamente el
feed session cursorEl servidor mantiene internamente:
pending_clustersdelivered_event_idsdelivered_item_idssource_cursors
El "más" posterior priorizará continuar consumiendo los
pending_clustersen la sesión
Los límites de responsabilidad son aproximadamente:
Capa de herramienta / servicio
Proporciona obtención de contenido, recuperación de candidatos, agrupación, clasificación y gestión de sesión de feed
Capa de agente
Responsable de la selección de herramientas y la continuación del contexto en diálogos de múltiples rondas
Por ejemplo, continuar con el lote anterior, desplegar el anterior, preguntar basándose en los resultados de la ronda anterior
Semántica de paginación actual:
get_latest_headlines / get_project_feed / get_project_opinions / get_trending_topicsDevuelven metadatos de cursor nativos del flujo ascendente
get_personal_feedDevuelve
next_cursoryhas_moreLa semántica de
cursores la continuación de la sesión de feed, no una paginación de lista ordinaria
Tecnologías / algoritmos utilizados actualmente
Python + MCP (
FastMCP)Adaptador de API de Followin
Extracción de entidades basada en reglas
coincidencia de alias
coincidencia de etiquetas de fuente
reglas de palabras clave
Clasificación de eventos
puntuación de múltiples señales basada en reglas
Confianza de entidad
strong / medium / weak
Recuperación semántica
Embedding de OpenAI
similitud de coseno
persistencia de vectores en SQLite
Agrupación
agrupación incremental codiciosa
superposición de Jaccard ponderada por confianza
similitud de Jaccard de títulos
similitud de embedding de ítems
Clasificación
ranker lineal heurístico
re-ranking de diversificación estilo MMR
¿Qué le falta al prototipo en comparación con la implementación de producción de la industria?
Capacidades del sistema de recuperación / recomendación
La capa de recomendación aún no tiene una estratificación real de representación de usuario a largo plazo / sesión
Aún no hay una cadena de actualización de perfil de usuario asíncrona impulsada por registros de comportamiento
Comprensión de contenido
Actualmente ya existe un descubrimiento de entidades ligero / NER débil (etiquetas, alias, reglas, extracción asistida por LLM), pero aún no hay una cadena principal de NER / enlace de entidades en línea general con desplazamiento de span
La taxonomía de eventos sigue siendo un sistema de reglas de arranque en frío, carente de calibración impulsada por datos etiquetados
El
credibility_scoreactual depende principalmente del tipo de fuente / metadatos proporcionados por el flujo ascendente; limitado por los límites de los datos, aún no hay una fiabilidad a nivel de fuente y verificación de múltiples fuentes más detallada
Agrupación
Actualmente ya se utiliza la similitud de embedding como una de las señales de agrupación, pero en general sigue siendo una agrupación heurística de múltiples señales, aún no hay un clasificador de pares / modelo de fusión entrenado
Si se evoluciona aún más hacia un sistema de agrupación en línea basado en un almacén de clústeres persistente, se necesitaría complementar la asignación de clústeres, así como capacidades de ciclo de vida del clúster como evolución entre días, división y fusión de clústeres
Clasificación
La clasificación actual ya utiliza
semantic_match_scoreimpulsado por embedding, pero el cuerpo principal sigue siendo un ranker lineal heurístico ponderado por características humanas, no un aprendizaje para clasificar (learned-to-rank)La capa de recomendación aún no ha incorporado características de comportamiento como clics, tiempo de permanencia, compartidos, etc.
La capa de recomendación solo ha realizado una diversificación MMR ligera, aún no hay un control de cuotas y restricciones de negocio más sistemáticos
Herramientas MCP expuestas actualmente
get_latest_headlinesget_trending_feedsget_project_feedget_project_opinionsget_trending_topicssearch_contentget_personal_feed
Demo Web
Si deseas probar de forma más intuitiva el "perfil de usuario aleatorio + diálogo de múltiples rondas", puedes iniciar una demo web:
python3 -m followin_mcp.demo.webappO después de la instalación:
followin-mcp-webLuego abre:
http://127.0.0.1:8000Esta demo admite:
Generación aleatoria de perfiles de usuario
Creación de una sesión de agente LangChain para el perfil actual
Conservación del contexto de chat de múltiples rondas en la misma sesión
Conservación del contexto
next_cursordisponible más reciente para herramientas que admiten paginaciónVisualización de una o más llamadas a herramientas que ocurrieron realmente en cada ronda
Visualización de tarjetas de parámetros de herramientas y resultados devueltos
Antes de ejecutar, asegúrate de que en .env se haya configurado:
FOLLOWIN_API_KEY=your_api_key
OPENAI_API_KEY=your_openai_api_keyServidor MCP
Actualmente se han expuesto las siguientes capacidades como herramientas MCP:
get_latest_headlinesget_trending_feedsget_project_feedget_project_opinionsget_trending_topicssearch_contentget_personal_feed
Forma de inicio:
python3 -m followin_mcp.mcp.serverO después de la instalación, usa:
followin-mcp-serverAgente ACP
Si deseas exponer el agente de diálogo actual como un agente stdio de ACP a clientes que admiten ACP, puedes iniciar:
python3 -m followin_mcp.acp.serverO después de la instalación, usa:
followin-acp-agentEl contenedor ACP actual reutiliza directamente FollowinChatAgent:
La sesión ACP corresponde a una sesión de
FollowinChatAgentprompt()llama internamente alchat_stream()existenteEl texto del asistente se devuelve al cliente ACP en fragmentos de flujo
El perfil de usuario lee por defecto
FOLLOWIN_ACP_PROFILE_JSON, si no está configurado, utiliza un perfil predeterminado incorporado
Si vas a conectarte a un acpx / OpenClaw local, ~/.acpx/config.json puede usar primero la configuración mínima:
{
"agents": {
"followin": {
"command": "/path/to/python",
"args": ["-m", "followin_mcp.acp.server"],
"cwd": "/path/to/followin-mcp"
}
}
}Aquí no es necesario escribir env adicional:
followin_mcp.acp.serverya haráload_dotenv()al iniciarseSiempre que
cwdapunte al directorio raíz del proyecto, leerá el.enven el repositorio
This server cannot be deployed
Maintenance
Related MCP Connectors
Real-time curated crypto news for AI agents with sentiment, recaps, and search.
Crypto fundamentals, sentiment, whale tracking and influencer call accuracy for traders and agents.
Evidence-backed crypto due diligence with sources, freshness, and a runtime receipt on every call.
Real-time financial news & regulatory intelligence: cited search, fetch, summaries, collections.
Related MCP Servers
- AlicenseBqualityFmaintenanceReal-time cryptocurrency news, analysis, and price predictions for AI agents. 5 tools to search 50,000+ articles across 12 categories, filter by 120+ asset tickers, and access content with built-in attribution. Free with attribution. SSE and Streamable HTTP transport.4MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to fetch news categories and hot news/tweets across various topics like crypto, DeFi, and AI.2352MIT
- FlicenseAqualityDmaintenanceProvides real-time Web3 research digest with macro news, KOL sentiment, market data, and personalized on-chain wallet analysis through four AI tools.4-
- AlicenseAqualityCmaintenanceEnables querying and aggregating Chinese and international news along with multi-platform trending topics, featuring deduplication, event clustering, and article extraction for AI clients.7MIT