# Carlos Cruz > Software engineer, who worked in scientific and research settings --- ## My first steps into MCP https://www.carcruz.dev/blog/intro-to-mcp Hello! This one is the first entry in what I expect will be a small series. I want to write it down now, while the idea is still more question than answer, so future-me has a record of where this started. It started with Kent C. Dodds. I've been chipping away at his talks and videos on the [Model Context Protocol](https://modelcontextprotocol.io/ 'Model Context Protocol') for a few weeks now, mostly on the train, and something clicked that hadn't clicked when I first skimmed the spec on my own. MCP servers are usually framed as a way to give an assistant new *tools* — call a function, get some JSON back, let the model narrate it. That's useful, but it's also just an API with extra steps. What caught my attention was the newer idea of MCP apps — tools that don't just return data, they return *UI*. Real, interactive components rendered inside the assistant, not text pretending to be a chart. That reframed a problem I've been circling for a while. I spend a lot of my day job at [Open Targets](https://www.opentargets.org/ 'Open Targets') building interactive widgets — charts, viewers, tables that already handle the messy edge cases and already look right. Today, if you want that view through an AI assistant, the model either calls a plain data API and reconstructs a description in words, or you just don't get it at all. Neither feels great when the real component already exists. So the idea I'm sitting with is: what if the assistant could render the widget itself? Not a summary of it — the actual component, live, inside the conversation. Open Targets just happens to be the codebase I know well enough to try it on first. ### The shape of the plan I haven't written the real implementation yet, but the planning is taking a shape I'm fairly confident in: - **A small MCP server** exposing a handful of existing widgets as tools, each one taking whatever identifiers the underlying data needs. - **A split between server code and widget code.** The server side just registers tools and serves a widget as an MCP UI resource. The widget side is the interesting part: the *actual* components, compiled standalone into self-contained browser bundles that can run inside an iframe with no dependency on the rest of the app they came from. - **A stub layer for the app's internal assumptions.** This is the part I expect to cause the most friction. Components built for a full app tend to assume they're mounted inside it — routing context, config providers, a data client, the works. None of that exists inside an assistant's iframe, so each bundle will need a thin compatibility layer to satisfy those imports without dragging the whole app along. - **One proof of concept before the rest.** Rather than migrating everything at once, I want to pick a single meaningfully complex widget and get it fully working end to end. If that one works, the rest is mostly repetition of the same pattern. None of this is shipped. Most of it isn't even prototyped yet — this post is me committing to the plan before I second-guess it into something blander. But I wanted to mark the starting point honestly: this is where the MCP thread begins for me, and I'd rather look back at an imperfect plan than have no record of the thinking at all. More on this as I actually get an iframe to render something real. Pura Vida! --- ## Three years working on Open Targets https://www.carcruz.dev/blog/three-years-open-targets Hello! Three years. I remember writing about [my first ten months at Open Targets](/blog/2021-review-2022-goals) and feeling like someone still learning the streets of a new city. That feeling is long gone. In that post I set three goals: bring modern web tooling into [Open Targets](https://www.opentargets.org/ 'Open Targets'), learn [Svelte](https://svelte.dev/ 'Svelte'), and explore [Rust](https://www.rust-lang.org/ 'Rust'). Two out of three is not bad. Svelte and Rust? Honest answer — no. They stayed on the wishlist, and then the wishlist changed. I am at peace with that. What replaced them was better. In 2022 we migrated the platform frontend to a [Turbo monorepo](https://blog.opentargets.org/next-steps-in-our-frontend-architecture-monorepo/), consolidating applications and libraries that had been living separate lives. It was one of those projects that sounds straightforward and isn't. The kind of work that teaches you more about a codebase than any feature you could build on top of it. What I didn't predict was becoming a team lead. That shift — from being the person writing the code to being the person helping a team write better code — changes how you measure progress. You start thinking about onboarding, about technical direction, about what a pull request teaches the person reviewing it. I didn't have that perspective three years ago. AI has also entered the picture — building an API connecting the platform to [OpenAI](https://openai.com/ 'OpenAI'), watching how researchers interact with it, thinking about what it changes for tools built around data exploration. That conversation is still early, but it already feels like a different kind of work. Three years in an academic open-source project teaches you that the pace is different, the purpose is different, and the collaborators are different — in the best way. Multidisciplinary work is slow and hard and worth it. Heading into year four with more to build. Pura Vida! --- ## Ten months working on an academic, open-source project. And goals for 2022 https://www.carcruz.dev/blog/2021-review-2022-goals Hello! Undoubtedly, the most important and radical change was taken in March when I joined the [Open Targets](https://www.opentargets.org/ 'Open Targets') team, part of the [Europan bioinformatics institute](https://www.ebi.ac.uk/ 'Europan bioinformatics institute'). This opportunity was more than a change of employer, which in itself is a big thing. Personal level, I moved from Costa Rica to the United Kingdom. On a professional level, it was changing to a purely open-source project and in an academic environment in which I had no previous experience other than experimental projects with small teams. The academic world prioritizes implementing improvements from an experimental point, as far as possible and reasonable. Comming from being part of companies where deliveries of new features and enhancements were a priority, it is an impact after more than seven years of experience. I have found that this has benefits. One of them is taking ownership of a feature or project. And have time to research, validate and collaborate. Another subject, and I think it arises from the above mentioned, is what I understand as technical debt. It is something that depends on how it is received. Both ways, as an advantage or a disadvantage. Coming from deep within the open-source web world, in the heyday of JQuery, BackboneJS, and CoffeeScript, where we were thrilled with the Bootstrap 2.0 release. I detect this as an opportunity to excel. Nowadays, a lot of front-end projects in academics are developing with [ReactJS](https://reactjs.org/ 'ReactJS'). But most of them do not take all the advantages that the modern web development ecosystem offers today. Frameworks such as [NextJS](https://nextjs.org/ 'NextJS') or [Gatsby](https://www.gatsbyjs.com/ 'Gatsby'). Technologies related to stylings such as [Tailwindcss](https://tailwindcss.com/ 'Tailwindcss') or styled components. And tools to improve code quality, such as linters, code-formatters, and testing in the UI at all levels (unite tests, integration tests, and end-to-end tests), do not take part in the scope of the projects. As a web developer in the [Open Targets](https://www.opentargets.org/ 'Open Targets') team, I feel comfortable having constant conversations related to these topics, even more so with the openness to adopt this new and robust implementation on the front-end. Another not minor point is the learning that what you develop impacts research. From my current position. In the use of data for systematic drug target identification and prioritization. In this spectrum of bioinformatics, there is much to collaborate on. Projects such as [Uniprot](https://www.uniprot.org/ 'Uniprot'), [Chembl](https://www.ebi.ac.uk/chembl/ 'Chembl'), and [Ensembl](https://www.ensembl.org/index.html 'Ensembl'), among others, would benefit from booming topics as data visualization with server-side rendering and incremental static regeneration, design centered on the user, and development tools such as monorepos and micro-front-ends. These months have given me a lot of perspective on what can be improved. I develop a robust idea of the value of projects that operate with mostly open-source code. Communities and multidisciplinary work are requirements to improve interfaces and user experience. My goal in 2022 is to integrate some of these modern web concepts into the [Open Targets](https://www.opentargets.org/ 'Open Targets') development model. From a more personal perspective, I am interested in improving my stack of development tools. Technologies like [Svelte](https://svelte.dev/ 'Svelte') and [SvelteKit](https://kit.svelte.dev/ 'SvelteKit') are attracting a lot of attention for the coming year. Together with [Antonio Solano](https://www.antonio-solano.com/), I plan to upgrade a personal project developed in 2015 called [VizGVar](https://www.carcruz.dev/projects/vizgvar 'VizGVar'). Our technology stack on the front-end will be [Svelte](https://svelte.dev/ 'Svelte') + [SvelteKit](https://kit.svelte.dev/ 'SvelteKit') with [Tailwindcss](https://tailwindcss.com/ 'Tailwindcss'), probably hosted on [Vercel](https://vercel.com/ 'Vercel'). It is an important step, as it was around 2015 starting exploring [ReactJS](https://reactjs.org/ 'ReactJS'). My other two goals are a lot more out of my comfort zone as a front-end developer. I am particularly interested in [Rust](https://www.rust-lang.org/ 'Rust'). It is a language that, in my opinion, is positioned to be of importance in the coming years, if it is not already. Also, that, as a JavaScript developer, I am excited to know that it is 100% focused on memory efficiency. [Rust](https://www.rust-lang.org/ 'Rust') can lead to enforce complex implementations in the browser. It will push us to create software that improves the development experience abode any ecosystem. Finally, and even further from my experience, I am interested in learning about information design. As a software developer, it seems vital to me to handle concepts on this subject. Today everything is related to data, and it is a key to capturing or not the needs of the users. Much to learn and much to explore. Time will give new challenges. With clear objectives, it is easier to shape so many ideas and trends that surround us today. I will be more active in sharing my progress on this blog, and of course, improving my site to add better ways to interact with me. Thank you for reading! As always, Pura Vida! --- ## Hello world 🚀 https://www.carcruz.dev/blog/hello-world Happy to see my site finally up and running. This space will be to share a bit of my work and experiences.Expect a lot of Javascript, and posts related to web development, data visualization and generative art! My idea with this small project is start my self-development path to become a better writer, also share a bit of the projects I work on. Thanks for read! If you have any sugestions or ideas, feel free to contact me to: me@carcruzcast.com Pura vida! --- ## Associations on the Fly https://www.carcruz.dev/projects/associations-on-the-fly Associations on the Fly is an interactive React tool built for the Open Targets Platform that lets pharmaceutical researchers dynamically adjust evidence weights when prioritizing drug targets. Published as lead author in Oxford Bioinformatics (2024), the tool enables real-time recalculation and visualization of association scores across 7.8 million target-disease associations from 20+ data sources. ### Role **Lead Author & React Component Lead** — I led the conceptualization, user research, and design of the interactive component, and drove the publication. The broader platform architecture and the backend were built by the Open Targets engineering team. ### Technical Architecture - **Frontend**: React/TypeScript component with real-time scoring interface (my primary contribution) - **Backend**: Scala API handling association recalculation, backed by a ClickHouse data instance - **Data**: 7.8M target-disease associations from 20+ evidence sources - **Integration**: Shipped as a core feature of the Open Targets Platform, used by 50k+ monthly users ### What I Built **React Component & UX** — Designed and built the interactive evidence weighting interface, allowing researchers to adjust scores and see results update instantly without needing bioinformatics expertise. **User Research** — Conducted research with the target user community to validate the tool's design and ensure it addressed real workflows in drug target prioritization. **Publication** — Led the writing and methodology documentation for the Oxford Bioinformatics paper, coordinating with co-authors across the Open Targets team. ### Research Impact - **Lead Author** in Oxford Bioinformatics (Impact Factor: 5.8) - **Integrated into Open Targets Platform** — used by pharmaceutical researchers and drug discovery teams globally - **Community-driven design** — tool requirements and validation shaped by direct engagement with the research community React TypeScript Scala ClickHouse Real-time Systems Data Visualization ### Credits Built within the Open Targets Platform, in collaboration with the engineering team responsible for the Scala/ClickHouse backend and the broader platform infrastructure. **Publication**: Cruz, C. et al. (2024). "Associations on the Fly, a new feature aiming to facilitate exploration of the Open Targets Platform evidence." Oxford Bioinformatics. https://doi.org/10.1093/bioinformatics/btaf070 --- ## OT Platform webapp https://www.carcruz.dev/projects/opentargets-platform-webapp The [Open Targets Platform](https://platform.opentargets.org) is a public-private partnership hosted at EMBL-EBI that systematically links genetic and genomic evidence to drug targets. The platform serves 50,000+ researchers globally, covering six entity types — Targets, Diseases, Drugs, Variants, Studies, and Credible Sets — with 15M+ target-disease associations from 20+ data sources. As Senior Frontend Engineer and Team Lead, I own the frontend architecture of [`ot-ui-apps`](https://github.com/opentargets/ot-ui-apps), the Turbo monorepo that powers the platform UI, and lead a cross-functional engineering team. ### Role **Senior Frontend Engineer & Team Lead** — responsible for frontend architecture decisions, team direction, code reviews, and onboarding of new engineers. ### Key Contributions **Monorepo architecture** — Migrated the platform frontend to a Turbo monorepo, consolidating multiple standalone applications and shared libraries into a unified, scalable codebase. — [blog post](https://blog.opentargets.org/next-steps-in-our-frontend-architecture-monorepo/) **Biome v2 migration** — Led the replacement of ESLint and Prettier with Biome across the monorepo, unifying linting and formatting tooling for the entire team. **Data visualization widgets** — Designed and developed core platform visualizations, including the baseline expression heatmap, using React and D3.js. **OT-AI-API** — Built a production API service ([ot-ai-api](https://github.com/opentargets/ot-ai-api)) using Node.js, OpenAI, and Google Cloud to power AI-assisted features in the platform. **Literature component** — Integrated state management to develop a literature mining UI component, surfacing relevant publications alongside target-disease evidence. TypeScript React D3.js Apollo Client GraphQL Vite Turbo GCP --- ## NX4 https://www.carcruz.dev/projects/nx4 NX4 is a web-based visualization tool for the exploration of aligned viral sequences. The tool was born as an alternative to matrix-based MSA visualizations. This is an open- source project maintained by a small group of web-developers, visualization researchers and computational scientists. I collaborated with researchers from Northeastern University and the Broad Institute of MIT and Harvard. ### Role Web developer, including owning the Dev-Ops. My role was primarily to help build the visualization tool using modern web technologies and creating development and deployment processes and environments. ### Achievements Published an [article in Oxford Bioinformatics](https://doi.org/10.1093/bioinformatics/btz457) about the application and its features JavaScript React Redux D3js ### Credits This project was develop in collaboration with Andres Colubri, Antonio Solano and Dietmar Offenhuber. --- ## VizGVar https://www.carcruz.dev/projects/vizgvar Bioinformatic Data Visualization tool developed using d3.js and native JavaScript. This is an ongoing personal project that aims to create new insights for researchers in the field of protein/DNA variations. ### Role My role as a Full Stack developer, includes developing the client side of the application, defining a software development process and choosing the appropriate technologies for implementation ### Achievements - Successfully developed a visualization tool that consumes data from the widely used Ensembl API - Published an [article in Oxford Bioinformatics](http://dx.doi.org/10.1093/bioinformatics/btx694) about the application and its features JavaScript D3js JQuery ### Credits This project was develop in collaboration with Allan Orozco, Antonio Solano and Veronica Alfaro. --- ## Museum Collections https://www.carcruz.dev/projects/colecciones A public-facing, interactive visualization of the Special Documents Collections of the [Bank of the Republic of Colombia](https://www.banrepcultural.org/coleccion-bibliografica/especiales). The website uses spatial navigation to display rich data about the museum’s collection. The viewer was the popular vote winner in the [Digital Humanities Awards 2020](http://dhawards.org/dhawards2020/results/), under the Best Digital Humantities tool or Suite of Tools category. ### Role Full stack engineer and DevOps, including architecting the visualization. JavaScript Redux P5 ### Credits This project was develop in collaboration with Andres Colubri. --- ## INTEL Smart City Manager https://www.carcruz.dev/projects/smart-city Smart City Manager is an interactive dashboard to communicate 5G capabilities such as enabling greater public safety, improved citizen services, and real-time monitoring of crowds, traffic, and the environment. ### Role Front-end engineer. I built this web-based geographic dashboard using d3 and Leaflet. The dashboard consumes real-time data using the MQTT protocol. JavaScript Redux D3Js Leaflet MQTT ### Credits This project was developed by the Volteo team in Costa Rica and Arizona. Copyright: Intel | Volteo Designer Veronica Alfaro Arias. --- ## IoT Space Utilization https://www.carcruz.dev/projects/spaces This interactive data visualization dashboard for Internet of Things (IoT) data helps monitor occupancy rates for a myriad of spaces in real-time. The project uses d3, React and react-based visualization libraries. JavaScript React Redux D3Js Leaflet MQTT ### Credits This project was developed by the Volteo team in Costa Rica and Arizona. Copyright: Volteo Designer Veronica Alfaro Arias.